web-dev-qa-db-fra.com

Appeler une méthode publique dans la classe d'activité à partir d'une autre classe?

ACTIVITÉ PRINCIPALE

    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)
        {

        }
    }

J'ai essayé d'appeler Mymethod () à partir d'une instance de MyClass . J'apprécierais vraiment toute aide. Merci.

14
Deepak

Pourquoi ne pas simplement passer l'activité au constructeur comme

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

Rendre cette méthode statique pour pouvoir appeler sans créer l'objet de classe

public static void Mymethod()
{}

et appelle comme ça

MainActivity.Mymethod();
10
Pratik

C'est probablement la meilleure façon de le faire. Voici comment je le fais. Cela s'appelle un Singleton Design Pattern: 

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

Vous devez passer l'instance de MainActivity dans une autre classe pour pouvoir appeler tout ce qui est public (dans MainActivity) de partout.

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

J'ai eu une classe interne que je voulais sortir dans une classe plus générale de bibliothèque "Helper". J'ai eu le même problème que vous. Je l'ai contourné en rendant la classe d'assistance abstraite, avec une seule méthode abstraite. Ensuite, dans mon package de projet, j'ai étendu la classe d'assistance avec un appel de constructeur dans la classe spécifique.

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
}

De cette manière, j'ai une classe d'assistance qui contient la grande majorité du "travail", et tout ce que j'ai à faire est de créer une sous-classe avec le constructeur et une méthode afin d'accéder à la méthode d'intérêt de l'activité d'appel.

2
XtopherSD

Si je vous ai bien compris, je pense que vous pouvez résoudre vos problèmes en utilisant une interface comme callback.

////ACTIVITÉ/////////////////////////////////

 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(){

}

////// Classe personnalisée ////////////////////

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

Dans le fichier MainActivity.classVous devez passer le contexte MainActivity de MainActivity Class. Ensuite, dans MyClass, vous devez obtenir le contexte MainActivity. Remember Context et MyActivity sont deux références différentes. 

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

// CLASSEMENT DANS UN FICHIER SÉPARÉ

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