简体   繁体   English

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

[英]How to call a method in MainActivity from another class?

How do I call the method startChronometer in another class when the method is declared inside the main activity?当方法在主活动中声明时,如何在另一个 class 中调用方法startChronometer

Inside MainActivity :MainActivity内部:

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

Inside another class, I tried to do this:在另一个 class 中,我尝试这样做:

MainActivity mActivity;
mActivity.startChronometer();

But an error occurred which said:但是发生错误说:

java.lang.NullPointerException. 

May I know what more I need to add to the code?我可以知道我还需要在代码中添加什么吗?

You can easily call a method from any Fragment inside your Activity by doing a cast like this:您可以通过以下方式轻松地从 Activity 中的任何 Fragment 调用方法:

Java爪哇

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

Kotlin科特林

(activity as MainActivity).startChronometer()

Just remember to make sure this Fragment's activity is in fact MainActivity before you do it.请记住在执行此操作之前确保此 Fragment 的活动实际上是 MainActivity。

Hope this helps!希望这可以帮助!

MainActivity.java 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另一个类.java

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

I would suggest, one should not make object of an Activity type class.我建议,不应该将 Activity 类型的类作为对象。

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

All Activities in Android must go through the Activity lifecycle so that they have a valid context attached to them. Android 中的所有活动都必须经过活动生命周期,以便它们具有附加的有效上下文。

By treating an Activity as a normal Java class, you end up with a null context.通过将 Activity 视为普通的 Java 类,您最终会得到一个空上下文。 As most methods in an Activity are called on its Context, you will get a null pointer exception, which is why your app crashes.由于 Activity 中的大多数方法都是在其 Context 上调用的,因此您将收到空指针异常,这就是您的应用程序崩溃的原因。

Instead, move all such methods which need to be called from other classes into a Utility class which accepts a valid context in its constructor, and then use that context in the methods to do the work.相反,将需要从其他类调用的所有此类方法移动到实用程序类中,该类在其构造函数中接受有效上下文,然后在方法中使用该上下文来完成工作。

What I have done with no memory leaks or lint warnings is to use @f.trajkovski's method, but instead of using MainActivity , use WeakReference<MainActivity> instead.在没有内存泄漏或 lint 警告的情况下,我所做的是使用 @f.trajkovski 的方法,但不是使用MainActivity ,而是使用 Wea​​kReference WeakReference<MainActivity>

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

Then in MainActivity OnCreate()然后在 MainActivity OnCreate()

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

Then in another class然后在另一个班级

MainActivity.getmInstanceActivity().yourMethod();

Works like a charm奇迹般有效

Initialize it first先初始化一下

MainActivity mActivity= new MainActivity();

Then you can continue然后你可以继续

mActivity.startChronometer();

MainActivity的 sub Fragment 中使用此代码来调用它的方法。

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

You have to pass instance of MainActivity into another class, then you can call everything public (in MainActivity) from everywhere.您必须将 MainActivity 的实例传递给另一个类,然后您可以从任何地方调用所有内容(在 MainActivity 中)。

MainActivity.java 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另一个类.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();
    }
}

What i have done and it works is create an instance in the MainActivity and getter for that instance:我所做的工作是在 MainActivity 中创建一个实例,并为该实例创建一个 getter:

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

And the in the onCreate method just point to that activity:而 onCreate 方法中的只是指向该活动:

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

And in onDestroy you should set this instance to null:在 onDestroy 中,您应该将此实例设置为 null:

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

Later you can call every method in whatever class you want:稍后你可以在任何你想要的类中调用每个方法:

MainActivity.getmInstanceActivity().yourMethod();

But an error occurred which says java.lang.NullPointerException.但是发生了一个错误,上面写着 java.lang.NullPointerException。

Thats because, you never initialized your MainActivity.那是因为,您从未初始化过 MainActivity。 you should initialize your object before you call its methods.你应该在调用它的方法之前初始化你的对象。

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

Simply, You can make this method static as below:简单地说,您可以将此方法设为静态,如下所示:

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

you can call this function in other class as below:您可以在其他类中调用此函数,如下所示:

MainActivity.startChronometer();

Easy method简单的方法

Use "static" keyword just like this像这样使用“静态”关键字

public static void startChronometer()
{
  // Your code
}

Then call method from your other class like this然后像这样从其他类调用方法

MainActivity.startChronometer();

Hope this work thank you希望这项工作谢谢

You can make this method static.您可以将此方法设为静态。

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

you can call this function in other class as below:您可以在其他类中调用此函数,如下所示:

MainActivity.startChronometer();

OR或者

You can make an object of the main class in second class like,您可以在第二类中创建主类的对象,例如,

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM