【问题标题】:Call a public method in the Activity class from another class?从另一个类调用 Activity 类中的公共方法?
【发布时间】:2011-12-11 19:02:04
【问题描述】:

主要活动

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

        }
    }

我试图从 MyClass 的实例调用 Mymethod()。 我真的很感激任何帮助。谢谢。

【问题讨论】:

  • 发布您用来尝试调用 myMethod() 的代码。你在实例化一个 MyActivity 对象吗?如果不是,我认为您将无法调用 myMethod() ,因为它不是静态的。您可以尝试将 myMethod() 设为静态,然后您应该能够使用 MyClass 中的 MyActivity.myMethod()。附:我真的希望您已经更改了类的名称以用于演示目的。如果这些是您在项目中实际使用的名称,您应该认真考虑使用更具描述性的名称。它会让你的代码更容易理解。
  • @Tim 我尝试使用传递给 MyClass 中的构造函数的上下文来调用,就像这样..
  • 在活动上使用静态方法是非常糟糕的做法,我强烈建议您找到一种方法来做您需要做的事情,而不需要在活动上使用静态方法。

标签: android class


【解决方案1】:

为什么不直接将活动传递给构造函数,比如

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

【讨论】:

  • 谢谢。这种方式使用起来完全安全吗?我一直听说内存泄漏,我不知道这是否适用。
  • @TheEyesHaveIt 我已经 6 年多没有编写过 java 代码了。我不知道。
【解决方案2】:

将该方法设为静态,这样您就可以在不创建类对象的情况下调用

public static void Mymethod()
{}

然后这样调用

MainActivity.Mymethod();

【讨论】:

  • 我无法将方法设为静态,因为它引用了非静态变量。所以将 MyClass 作为活动类的内部类是唯一的解决方案
【解决方案3】:

这可能是最好的方法。我就是这样做的。它被称为单例设计模式:

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

【讨论】:

  • 您不能使用静态 setInstance 中的“this”,但也许这是一个很酷的方法,只是想知道该类是否已实例化
  • Eww。不,这是等待发生的资源泄漏
【解决方案4】:

如果我对您的理解正确,我相信您可以使用接口作为回调来解决您的问题。

////活动////////////////////////////

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

【讨论】:

    【解决方案5】:

    我有一个内部类,我想将它提取到一个更通用的库“Helper”类中。我遇到了和你一样的问题。我通过使用一个抽象方法将辅助类抽象化来解决它。然后在我的项目包中,我使用特定类中的构造函数调用扩展了辅助类。

    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
    }
    

    这样,我就有了一个包含绝大多数“工作”的辅助类,我所要做的就是用构造函数和一个方法创建一个子类,以便访问调用活动的方法兴趣。

    【讨论】:

      【解决方案6】:

      您必须将 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 个可能必须访问该类的活动,那么该类中是否有任何方法可以确定正在使用哪个活动上下文?我的特定类由 2 个不同的活动访问,我可以按照您为每个活动显示的那样设置它,只是想知道是否可以将上下文设置为可以在我的类中使用的通用变量?像 currentContext= 之类的东西正在使用哪个活动上下文,所以当我必须引用上下文时,我可以使用 currentcContext 代替 mainActivity 或 secondActivity。
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        我决定将 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();
            }
        

        【讨论】:

        • 我选择这个作为答案只是因为我使用了这个解决方案。其他解决方案似乎同样有趣。
        • 为什么要复制别人的答案并在自己的帖子中标记为已检查?这很奇怪......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多