21

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

内部MainActivity

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

在另一个类中,我尝试这样做:

MainActivity mActivity;
mActivity.startChronometer();

但是发生了一个错误,它说:

java.lang.NullPointerException. 

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

4

12 回答 12

38

您可以通过以下方式轻松地从 Activity 中的任何 Fragment 调用方法:

爪哇

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

科特林

(activity as MainActivity).startChronometer()

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

希望这可以帮助!

于 2014-08-12T09:18:31.747 回答
26

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

另一个类.java

public Class AnotherClass() {
     // call this method
     MainActivity.getInstance().myMethod();
}
于 2017-11-11T19:14:17.070 回答
17

我建议,不应该将 Activity 类型的类作为对象。

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

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

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

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

于 2014-08-12T09:31:21.843 回答
12

在没有内存泄漏或 lint 警告的情况下,我所做的是使用 @f.trajkovski 的方法,但不是使用MainActivityWeakReference<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();

奇迹般有效

于 2020-03-31T05:25:39.970 回答
4

先初始化一下

MainActivity mActivity= new MainActivity();

然后你可以继续

mActivity.startChronometer();
于 2013-06-26T09:11:53.383 回答
3

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

另一个类.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();
    }
}
于 2017-11-08T17:02:32.117 回答
3

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

((MainActivity) getActivity()).startChronometer();
于 2017-01-18T11:23:22.787 回答
1

但是发生了一个错误,上面写着 java.lang.NullPointerException。

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

MainActivity mActivity = new MainActivity();//make sure that you pass the appropriate arguments if you have an args constructor
mActivity.startChronometer();
于 2013-06-26T09:07:21.773 回答
1

我所做的工作是在 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();
于 2017-11-29T08:08:48.353 回答
-1

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

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

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

MainActivity.startChronometer();
于 2013-06-26T09:15:27.023 回答
-1

[简单方法]

[像这样使用“静态”关键字]

public static void startChronometer() { ........你的代码....... }

[然后像这样从你的其他类调用方法]

MainActivity.startChronometer();

希望这项工作谢谢

于 2021-09-01T14:08:03.953 回答
-2

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

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

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

MainActivity.startChronometer();

或者

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

MainActivity mActivity = new MainActivity();
mActivity.startChronometer();
于 2013-06-26T09:10:53.943 回答