如何从另一个类调用MainActivity中的方法?

时间:2013-06-26 09:05:27

标签: java android

当在主要活动中声明方法时,如何在另一个类中调用方法startChronometer

内部MainActivity

public void startChronometer() {
    mChronometer.start();
    showElapsedTime();
}

在另一堂课中,我试图这样做:

MainActivity mActivity;
mActivity.startChronometer();

但是发生了一个错误:

java.lang.NullPointerException. 

我可以知道还需要添加什么代码吗?

11 个答案:

答案 0 :(得分:22)

您可以通过执行以下操作来轻松调用Activity中任何Fragment的方法:

<强>爪哇

((MainActivity)getActivity()).startChronometer();

<强>科特林

(activity as MainActivity).startChronometer()

请记住在执行此操作之前确保此Fragment的活动实际上是MainActivity。

希望这有帮助!

答案 1 :(得分:9)

我建议,不应该创建一个Activity类型的对象。

MainActivity mActivity = new MainActivity();  // BIG NO TO THIS.

Android中的所有活动都必须经历活动生命周期,以便他们附加有效的上下文。

通过将Activity视为普通的Java类,您最终会得到一个空上下文。由于Activity中的大多数方法都在其Context上调用,因此您将获得一个空指针异常,这就是您的应用程序崩溃的原因。

相反,将需要从其他类调用的所有此类方法移动到Utility类中,该类在其构造函数中接受有效上下文,然后在方法中使用该上下文来完成工作。

答案 2 :(得分:9)

<强> MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static MainActivity instance;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        instance = this;
    }

    public static MainActivity getInstance() {
        return instance;
    }

    public void myMethod() {
       // do something...
    }
)

<强> AnotherClass.java

public Class AnotherClass() {
     // call this method
     MainActivity.getInstance().myMethod();
}

答案 3 :(得分:5)

首先初始化

MainActivity mActivity= new MainActivity();

然后你可以继续

mActivity.startChronometer();

答案 4 :(得分:4)

  

但是发生了一个错误,说java.lang.NullPointerException。

那是因为你从未初始化你的MainActivity。你应该在调用它的方法之前初始化你的对象。

MainActivity mActivity = new MainActivity();//make sure that you pass the appropriate arguments if you have an args constructor
mActivity.startChronometer();

答案 5 :(得分:3)

MainActivity的子片段中使用此代码来调用其上的方法。

((MainActivity) getActivity()).startChronometer();

答案 6 :(得分:1)

您必须将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 startChronometer(){
        ...
    }
}

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

答案 7 :(得分:0)

我做了什么,它的工作原理是在MainActivity中创建一个实例,并为该实例创建getter:

 public class MainActivity extends AbstractMainActivity {
    private static MainActivity mInstanceActivity;
    public static MainActivity getmInstanceActivity() {
    return mInstanceActivity;
    }

而onCreate方法只指向该活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
mInstanceActivity = this;
}

在onDestroy中,您应该将此实例设置为null:

@Override
protected void onDestroy() {
    super.onDestroy();
    mInstanceActivity = null;
}

稍后您可以调用您想要的任何类中的每个方法:

MainActivity.getmInstanceActivity().yourMethod();

答案 8 :(得分:0)

我没有出现内存泄漏或棉绒警告的情况是使用@ f.trajkovski的方法,而不是使用MainActivity,而是使用WeakReference<MainActivity>

public class MainActivity extends AppCompatActivity {
public static WeakReference<MainActivity> weakActivity;
// etc..
 public static MainActivity getmInstanceActivity() {
    return weakActivity.get();
}
}

然后在MainActivity OnCreate()

weakActivity = new WeakReference<>(MainActivity.this);

然后在另一堂课

MainActivity.getmInstanceActivity().yourMethod();

像魅力一样工作

答案 9 :(得分:-2)

您可以将此方法设为静态。

public static void startChronometer(){
        mChronometer.start();
        showElapsedTime();
    } 

您可以在其他课程中调用此函数,如下所示:

MainActivity.startChronometer();

OR

您可以在第二类中创建主类的对象,如

MainActivity mActivity = new MainActivity();
mActivity.startChronometer();

答案 10 :(得分:-2)

简单地说,您可以将此方法设为静态,如下所示:

public static void startChronometer(){
    mChronometer.start();
    showElapsedTime();
} 

您可以在其他课程中调用此函数,如下所示:

MainActivity.startChronometer();