Вызывать открытый метод в классе Activity из другого класса? - PullRequest
14 голосов
/ 20 октября 2011

ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ

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

        }
    }

Я пытался вызвать Mymethod () из экземпляра MyClass.Я был бы очень признателен за любую помощь.Спасибо.

Ответы [ 8 ]

24 голосов
/ 20 октября 2011

Почему бы просто не передать действие конструктору, как

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();
    } 
} 
10 голосов
/ 20 октября 2011

Сделайте этот метод статическим, чтобы вы могли вызывать его без создания объекта класса

public static void Mymethod()
{}

и звоните вот так

MainActivity.Mymethod();
8 голосов
/ 13 февраля 2016

Это, наверное, лучший способ сделать это. Вот как я это делаю. Он называется 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);
    }
}
3 голосов
/ 02 октября 2014

Если я правильно вас понимаю, я считаю, что вы можете решить свои проблемы, используя интерфейс в качестве обратного вызова.

//// АКТИВНОСТЬ /////////////////////////////////

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

}

////// Custom Class //////////////////

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 голосов
/ 08 ноября 2017

Вы должны передать экземпляр MainActivity в другой класс, затем вы можете вызывать все общедоступное (в MainActivity) из любого места.

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 голосов
/ 19 декабря 2012

У меня был внутренний класс, который я хотел вытащить в более общий класс библиотеки "Помощник".У меня была та же проблема, что и у вас.Я обошел это, сделав вспомогательный класс абстрактным, с помощью одного абстрактного метода.Затем в своем пакете проекта я расширил вспомогательный класс вызовом конструктора в определенном классе.

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
}

Таким образом, у меня есть вспомогательный класс, который содержит подавляющее большинство «работы», иМне нужно сделать подкласс с помощью конструктора и одного метода, чтобы получить доступ к интересующему методу вызывающего действия.

0 голосов
/ 13 апреля 2018

В файле MainActivity.class Вы должны передать контекст MainActivity из класса MainActivity. Затем в MyClass вы должны получить контекст MainActivity. Помните, что Context и MyActivity - это две разные ссылки.

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

// ПОМОЩЬ КЛАССА В ОТДЕЛЬНОМ ФАЙЛЕ

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

      this.context.Mymethod();
      //Or you can directly use activity context
      context.Mymethod();
    }
}
0 голосов
/ 22 октября 2011

Я решил написать HelperClass MyClass как внутренний класс класса MyActivity.Это дает ему полный доступ к родительскому классу, но сейчас MyClass ограничен только классом MyActivity.

public class MyActivity() extends Activity
{
    onCreate()
    { 
        MyClass myobj=new MyClass();

    } 

    public void myMethod()
    {

    } 
} 
//INNER CLASS
    public class MyClass
    { 
        public MyClass() 
        { 

        } 
        //I can directly access the MyMethod
        myMethod();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...