Как вызвать метод в 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();