Вызвать общедоступный метод в классе Activity из другого класса?

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

    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. Я бы очень признателен за любую помощь. Спасибо.

Ответ 1

Я решил написать 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();
    }

Ответ 2

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

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();
    } 
} 

Ответ 3

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

public static void Mymethod()
{}

и вызывается так:

MainActivity.Mymethod();

Ответ 4

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

Ответ 5

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

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

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

}

//////Пользовательский класс //////////////////

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 method do this
          mListener.onInterestingEvent();
     }
}

Ответ 6

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

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
}

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

Ответ 7

Вы должны передать экземпляр 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();
    }
}

Ответ 8

В файле 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();
    }
}

Ответ 9

эю фп упи sldfgsdfgsdfgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg