Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从另一个类调用MainActivity中的方法?_Java_Android - Fatal编程技术网

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

Java 如何从另一个类调用MainActivity中的方法?,java,android,Java,Android,当方法在主活动中声明时,如何在另一个类中调用方法startChronometer 内部main活动: public void startChronometer() { mChronometer.start(); showElapsedTime(); } 在另一个班级里,我试着这样做: MainActivity mActivity; mActivity.startChronometer(); 但是发生了一个错误,它说: java.lang.NullPointerExceptio

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

内部
main活动

public void startChronometer() {
    mChronometer.start();
    showElapsedTime();
}
在另一个班级里,我试着这样做:

MainActivity mActivity;
mActivity.startChronometer();
但是发生了一个错误,它说:

java.lang.NullPointerException. 
我可以知道我还需要在代码中添加什么吗

但是发生了一个错误,显示java.lang.NullPointerException

这是因为,您从未初始化主活动。在调用对象的方法之前,应该初始化对象

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

可以将此方法设置为静态

public static void startChronometer(){
        mChronometer.start();
        showElapsedTime();
    } 
您可以在其他类中调用此函数,如下所示:

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

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

MainActivity mActivity = new MainActivity();
mActivity.startChronometer();
首先初始化它

MainActivity mActivity= new MainActivity();
然后你可以继续

mActivity.startChronometer();

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

MainActivity.startChronometer();
public static void startChronometer(){
    mChronometer.start();
    showElapsedTime();
} 
MainActivity.startChronometer();
您可以在其他类中调用此函数,如下所示:

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

通过执行如下转换,您可以轻松地从活动中的任何片段调用方法:

Java

((MainActivity)getActivity()).startChronometer();
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(){
        ...
    }
}
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();
    }
}
Kotlin

(activity as MainActivity).startChronometer()
请记住,在执行此操作之前,请确保此片段的活动实际上是MainActivity


希望这有帮助

我建议,不应该将对象设置为活动类型类

MainActivity mActivity = new MainActivity();  // BIG NO TO THIS.
Android中的所有活动都必须经过活动生命周期,以便它们具有有效的上下文

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


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

MainActivity
的子片段中使用此代码对其调用该方法

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

您必须将MainActivity的实例传递到另一个类中,然后您可以从任何地方调用一切公共的(在MainActivity中)

MainActivity.java

((MainActivity)getActivity()).startChronometer();
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(){
        ...
    }
}
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();
    }
}
AnotherClass.java

((MainActivity)getActivity()).startChronometer();
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(){
        ...
    }
}
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();
    }
}
MainActivity.java

((MainActivity)getActivity()).startChronometer();
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(){
        ...
    }
}
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();
    }
}
AnotherClass.java

((MainActivity)getActivity()).startChronometer();
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(){
        ...
    }
}
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();
    }
}

我所做的工作是在MainActivity中创建一个实例,并获取该实例:

 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();

在没有内存泄漏或lint警告的情况下,我所做的是使用@f.trajkovski的方法,但不是使用
MainActivity
,而是使用
WeakReference

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


像符咒一样工作

MainActivity mActivity=newmainActivity();mActivity.startChronometer()你试图做的事情散发出糟糕的设计和紧密耦合的味道。这就是我问你是否在做一些非活动任务的原因。这里您将再次获得
mchrometer
的NPE。所以你应该考虑一下,你应该只为活动相关的目的而设置活动类。请为任何非活动目的定义标准类,如计时器。然后尽可能多地在活动中使用这些类@shannon@PankajKumarFWIW,在活动类中使用
new
几乎从来都不是一个好主意,包括本例。(是的,以前的帖子,今天因为有人发布了新答案而变得活跃。)你不必给出相同的新答案,你可以对现有答案进行投票。对吗?FWIW,从来没有用
new
@laalto实例化过活动类,我从来没有做过android。这只是一个将
mActivity
初始化为avid
NPE
的提示。您可以对其进行适当的初始化。@PankajKumar很抱歉谁先提供答案?每天都会发布数十个android问题,根本问题是用
new
实例化一个活动。这样的活动没有任何好处,因为它们没有真正初始化。因此,在这种情况下使用
new
的建议是不好的。与其给出相同的新答案,不如对现有答案进行投票。对吧?mChronometer似乎是一个主要活动的私人财产。除非mChronometer也是静态的,否则这不会起作用。FWIW,永远不要用
new
实例化活动类。不要给出相同的新答案,而是可以更新现有答案。对吗?
mChronometer
需要是静态的,并且不绑定到对象所在的类的实例。。。DownvoteFWIW,永远不要用
new
实例化活动类。活动没有带参数的构造函数!如果有一个定义的话,那就是做错事了,我同意。这保持了代码组件之间的良好分离。我所做的是提供一个接口,该接口由主活动实现,并在其构造函数中传递给其他活动或线程。这使得单元测试更加容易,因为测试代码可以提供相同的接口,而无需将其提交到特定的实现中。您可以在另一个类中调用
活动
中的方法或字段,如:
((MainActivity)context)startChronometer()((MainActivity)context)startChronometer()
在你的
另一个类中
?和你一样。你是