Как вызвать метод в MainActivity из другого класса?

Как вызвать метод startChronometer в другом классе, когда метод объявлен внутри основного действия?

Внутри MainActivity:

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

Внутри другого класса я попытался сделать это:

MainActivity mActivity;
mActivity.startChronometer();

Но произошла ошибка, которая сказала:

java.lang.NullPointerException. 

Могу ли я узнать, что еще мне нужно добавить в код?

Ответ 1

Вы можете легко вызвать метод из любого фрагмента в вашей деятельности, выполнив приведение типа этого:

Джава

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

Котлин

(activity as MainActivity).startChronometer()

Просто не забудьте убедиться, что это действие фрагмента фактически MainActivity, прежде чем вы это сделаете.

Надеюсь это поможет!

Ответ 2

Я бы предположил, что не следует создавать объект класса типа Activity.

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

Все действия в Android должны проходить жизненный цикл Activity, чтобы у них был допустимый контекст, прикрепленный к ним.

Рассматривая Activity как обычный Java-класс, вы получаете нулевой контекст. Поскольку большинство методов в Activity вызываются в его Контексте, вы получите исключение нулевого указателя, поэтому ваше приложение вылетает.

Вместо этого переместите все такие методы, которые нужно вызывать из других классов в класс Utility, который принимает допустимый контекст в его конструкторе, а затем использовать этот контекст в методах для выполнения работы.

Ответ 3

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

Ответ 4

Инициализировать сначала

MainActivity mActivity= new MainActivity();

Затем вы можете продолжить

mActivity.startChronometer();

Ответ 5

Но произошла ошибка, которая говорит об ошибке java.lang.NullPointerException.

Это потому, что вы никогда не инициализировали свою MainActivity. вы должны инициализировать свой объект, прежде чем вы вызовете его методы.

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

Ответ 6

Используйте этот код в субфрагменте MainActivity, чтобы вызвать метод на нем.

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

Ответ 7

Вы должны передать экземпляр 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();
    }
}

Ответ 8

Что я сделал, и он работает, это создать экземпляр в 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();

Ответ 9

Инициализируйте экземпляр основного действия в другом классе, где вы хотите использовать его метод.

Просто попробуйте это, у меня получилось :)

MainActivity mActivity = new MainActivity(this);

mActivity.startChronometer();

Ответ 10

Вы можете сделать этот метод статическим.

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

эту функцию можно вызвать в другом классе, как показано ниже:

MainActivity.startChronometer();

ИЛИ

Вы можете сделать объект основного класса во втором классе, например,

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

Ответ 11

Просто вы можете сделать этот метод статическим, как показано ниже:

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

эту функцию можно вызвать в другом классе, как показано ниже:

MainActivity.startChronometer();