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

sha*_*non 15 java android

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)

希望这可以帮助!

  • 这不能回答问题。不是来自 FRAGMENT,而是来自另一个 ACTIVITY 类。 (9认同)

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)

  • 这导致内存泄漏! (2认同)

Har*_*edi 8

我建议,不应该成为Activity类的对象.

MainActivity mActivity = new MainActivity();  // BIG NO TO THIS.
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 我同意。这在代码组件之间保持了良好的分离。我所做的是提供一个由主活动实现的接口,并在其构造函数中传递给其他活动或线程。这使得单元测试更容易,因为测试代码可以提供相同的接口,而无需将其提交给特定的实现。 (2认同)

小智 7

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

奇迹般有效


Ruc*_*era 6

首先初始化它

MainActivity mActivity= new MainActivity();
Run Code Online (Sandbox Code Playgroud)

然后你可以继续

mActivity.startChronometer();
Run Code Online (Sandbox Code Playgroud)

  • 而不是给出相同的新答案,你可以赞成现有的答案.对? (11认同)
  • FWIW,永远不要用`new`实例化活动类. (5认同)
  • 每天都会发布几十个问题,其中根问题是使用`new`实例化一个活动.这些活动对任何事情都没有好处,因为它们并没有真正初始化.因此,在这种情况下使用"新"的建议是不好的. (4认同)

Per*_*ror 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();
Run Code Online (Sandbox Code Playgroud)

  • FWIW,永远不要用“new”实例化活动类。 (2认同)