Вызвать общедоступный метод в классе 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