it-swarm-id.com

Panggil metode publik di kelas Activity dari kelas lain?

AKTIFITAS UTAMA

    public class MyActivity() extends Activity
    {
        onCreate()
        {
            MyClass myobj=new MyClass();    
        }
        public void Mymethod()
        {}
    }
//HELPER CLASS IN A SEPARATE FILE    
    public class MyClass()
    {
        MyClass(Context context)
        {

        }
    }

Saya mencoba menelepon Mymethod () dari instance MyClass . Saya akan sangat menghargai bantuan. Terima kasih.

14
Deepak

Mengapa tidak meneruskan aktivitas ke konstruktor saja

public class MyActivity extends Activity { 

   onCreate(){ 
        MyClass myobj=new MyClass(MyActivity.this);     
   } 

   public void myMethod(){

   } 
} 

//HELPER CLASS IN A SEPARATE FILE     
public class MyClass{ 
    public MyClass(MyActivity act) { 
        act.myMethod();
    } 
} 
24
blessenm

Jadikan metode itu statis sehingga Anda dapat memanggil tanpa membuat objek kelas

public static void Mymethod()
{}

dan panggilan seperti ini

MainActivity.Mymethod();
10
Pratik

Ini mungkin cara terbaik untuk melakukannya. Ini adalah bagaimana saya melakukannya. Ini disebut Pola Desain Singleton: 

public class MyActivity extends Activity {
    private static MainActivity instance;

    public static MainActivity getInstance() {
     if(instance==null){
          setInstance(this);
        }
        return instance;
    }

    public static void setInstance(MainActivity instance) {
        MainActivity.instance = instance;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setInstance(this);
    }
}
8
pier shaw

Anda harus mengirimkan instance MainActivity ke kelas lain, maka Anda dapat memanggil semuanya publik (dalam MainActivity) dari mana-mana.

MainActivity.Java

public class MainActivity extends AppCompatActivity {

    // Instance of AnotherClass for future use
    private AnotherClass anotherClass;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Create new instance of AnotherClass and
        // pass instance of MainActivity by "this"
        anotherClass = new AnotherClass(this);
    }

    // Method you want to call from another class
    public void myMethod(){
        ...
    }
}

AnotherClass.Java

public class AnotherClass {

    // Main class instance
    private MainActivity mainActivity;  

    // Constructor
    public AnotherClass(MainActivity activity) {

        // Save instance of main class for future use
        mainActivity = activity;  

        // Call method in MainActivity
        mainActivity.myMethod();
    }
}
2
Tmthetom

Saya memiliki kelas batin yang ingin saya tarik ke perpustakaan "Pembantu" kelas yang lebih umum. Saya memiliki masalah yang sama dengan Anda. Saya mengatasinya dengan membuat abstrak kelas helper, dengan metode abstrak tunggal. Kemudian dalam paket proyek saya, saya memperluas kelas pembantu dengan panggilan konstruktor di kelas tertentu.

public class MyActivity extends Activity {
    onCreate() {
        MyHelperClass = new MyHelperClass(this, "foobar");
    }

    public void myMethod() {
        // Code...
    }
}

// In a different file
public class MyHelperClass extends HelperClass {
    private MyActivity mInstance;

    public MyHelperClass(MyActivity act, String data) {
        super();
        this.mInstance = act;
        this.mActivity = act;  // Useful for calling generic Activity methods in the HelperClass
        this.mData = data;
    }

    protected void callMyActivityMethod() {
        mInstance.myMethod();
    }
}

// In a different file
public abstract class HelperClass {
    protected Activity  mActivity;
    protected String    mData;

    public HelperClass() {
        // Subclass will set variables
    }

    protected abstract void callMyActivityMethod();

    // More code for all the other stuff the class does
}

Dengan cara ini, saya memiliki kelas pembantu yang berisi sebagian besar "pekerjaan", dan yang harus saya lakukan adalah membuat subkelas dengan konstruktor dan satu metode untuk mendapatkan akses ke metode minat aktivitas aktivitas panggilan.

2
XtopherSD

Jika saya memahami Anda dengan benar, saya yakin Anda dapat memecahkan masalah Anda menggunakan antarmuka sebagai panggilan balik.

////AKTIVITAS/////////////////////////////////

 public class MyActivity() extends Activity {

    onCreate()
    {
        MyClass myObj=new MyClass();   

        //Set the listener on the object. Created as anonymous
        myObj.setListener(new MyClass.Listener() {
             myMethod();
        });
    }
}

public void myMethod(){

}

////// Kelas Khusus //////////////////

public class MyClass {
     Listener mListener;

     public interface Listener {
          public void onInterestingEvent();
     }

     public void setListener(Listener listener) {
          mListener = listener;
     }

     public void someUsefulThingTheClassDoes() {
          //Do your code here and when you're ready to call the activity's method do this
          mListener.onInterestingEvent();
     }
}
2
neonDion

Dalam file MainActivity.classYou harus melewati konteks MainActivity dari MainActivity Class. Kemudian di MyClass Anda harus mendapatkan konteks MainActivity. Ingat Konteks dan MyActivity adalah dua referensi yang berbeda. 

public class MyActivity extends Activity
{
    onCreate(){
        MyClass myobj=new MyClass(MyActivity context);    
    }
    public void Mymethod(){}
}

// KELAS HELPER DALAM FILE TERPISAH

public class MyClass()
{
    MyActivity context;
    MyClass(MyActivity context)
    {
      this.context = context;

      this.context.Mymethod();
      //Or you can directly use activity context
      context.Mymethod();
    }
}
0
Yash