当在主要活动中声明方法时,如何在另一个类中调用方法startChronometer
?
内部MainActivity
:
public void startChronometer() {
mChronometer.start();
showElapsedTime();
}
在另一堂课中,我试图这样做:
MainActivity mActivity;
mActivity.startChronometer();
但是发生了一个错误:
java.lang.NullPointerException.
我可以知道还需要添加什么代码吗?
答案 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();