startChronometer在主活动中声明方法时,如何在另一个类中调用该方法?
内部MainActivity:
public void startChronometer() {
mChronometer.start();
showElapsedTime();
}
Run Code Online (Sandbox Code Playgroud)
在另一个课程中,我试图这样做:
MainActivity mActivity;
mActivity.startChronometer();
Run Code Online (Sandbox Code Playgroud)
但是发生了一个错误:
java.lang.NullPointerException.
Run Code Online (Sandbox Code Playgroud)
我可以知道还需要添加什么代码吗?
Ric*_*Dev 24
您只需执行以下操作即可轻松地从Activity中的任何Fragment调用方法:
((MainActivity)getActivity()).startChronometer();
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!
Aha*_*kat 11
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...
}
)
Run Code Online (Sandbox Code Playgroud)
AnotherClass.java
public Class AnotherClass() {
// call this method
MainActivity.getInstance().myMethod();
}
Run Code Online (Sandbox Code Playgroud)
我建议,不应该成为Activity类的对象.
MainActivity mActivity = new MainActivity(); // BIG NO TO THIS.
Run Code Online (Sandbox Code Playgroud)
Android中的所有活动都必须通过活动生命周期,以便它们附加有效的上下文.
通过将Activity视为普通的Java类,最终得到一个空上下文.由于Activity中的大多数方法都在其Context上调用,因此您将获得空指针异常,这就是您的应用程序崩溃的原因.
相反,将需要从其他类调用的所有此类方法移动到Utility类中,该类在其构造函数中接受有效上下文,然后在方法中使用该上下文来完成工作.
小智 7
我在没有内存泄漏或 lint 警告的情况下所做的是使用 @f.trajkovski 的方法,但不是使用MainActivity,WeakReference<MainActivity>而是使用。
public class MainActivity extends AppCompatActivity {
public static WeakReference<MainActivity> weakActivity;
// etc..
public static MainActivity getmInstanceActivity() {
return weakActivity.get();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在 MainActivity OnCreate()
weakActivity = new WeakReference<>(MainActivity.this);
Run Code Online (Sandbox Code Playgroud)
然后在另一个班级
MainActivity.getmInstanceActivity().yourMethod();
Run Code Online (Sandbox Code Playgroud)
奇迹般有效
首先初始化它
MainActivity mActivity= new MainActivity();
Run Code Online (Sandbox Code Playgroud)
然后你可以继续
mActivity.startChronometer();
Run Code Online (Sandbox Code Playgroud)
但是发生了错误,提示 java.lang.NullPointerException。
那是因为,您从未初始化过 MainActivity。您应该在调用对象的方法之前初始化该对象。
MainActivity mActivity = new MainActivity();//make sure that you pass the appropriate arguments if you have an args constructor
mActivity.startChronometer();
Run Code Online (Sandbox Code Playgroud)