Reputation: 589
How do I call the method startChronometer
in another class when the method is declared inside the main activity?
Inside MainActivity
:
public void startChronometer() {
mChronometer.start();
showElapsedTime();
}
Inside another class, I tried to do this:
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?
Upvotes: 26
Views: 154247
Reputation: 11
i personally would take in the context as an argument when instantiating the OtherClass inside MainActivity, and inside the OtherClass, explicitly cast it into MainActivity type for whenever i need it.
inside MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OtherClass otherClass = new OtherClass(this);
}
inside OtherClass:
public class OtherClass {
private Context context;
public OtherClass(Context context) {
this.context = context;
}
public whateverMethod() {
((MainActivity) context).startChronometer();
}
}
Upvotes: 1
Reputation: 584
In Kotlin, if passing MainActivity
as a Context
into a fragment, you can also do:
(context as MainActivity).startChronometer()
to cast context to MainActivity and before using it.
Upvotes: 0
Reputation: 1
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
Upvotes: -1
Reputation: 229
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.
public class MainActivity extends AppCompatActivity {
public static WeakReference<MainActivity> weakActivity;
// etc..
public static MainActivity getmInstanceActivity() {
return weakActivity.get();
}
}
Then in MainActivity OnCreate()
weakActivity = new WeakReference<>(MainActivity.this);
Then in another class
MainActivity.getmInstanceActivity().yourMethod();
Works like a charm
Upvotes: 16
Reputation: 933
You can easily call a method from any Fragment inside your Activity by doing a cast like this:
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.
Hope this helps!
Upvotes: 45
Reputation: 4644
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();
}
Upvotes: 30
Reputation: 825
What i have done and it works is create an instance in the MainActivity and getter for that instance:
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:
@Override
protected void onCreate(Bundle savedInstanceState) {
mInstanceActivity = this;
}
And in onDestroy you should set this instance to null:
@Override
protected void onDestroy() {
super.onDestroy();
mInstanceActivity = null;
}
Later you can call every method in whatever class you want:
MainActivity.getmInstanceActivity().yourMethod();
Upvotes: 2
Reputation: 79
You have to pass instance of MainActivity into another class, then you can call everything public (in MainActivity) from everywhere.
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();
}
}
Upvotes: 4
Reputation: 71
Use this code in sub Fragment of MainActivity
to call the method on it.
((MainActivity) getActivity()).startChronometer();
Upvotes: 3
Reputation: 7626
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();
Upvotes: -1
Reputation: 35557
Initialize it first
MainActivity mActivity= new MainActivity();
Then you can continue
mActivity.startChronometer();
Upvotes: 4
Reputation: 21087
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();
Upvotes: -3
Reputation: 46408
But an error occurred which says java.lang.NullPointerException.
Thats because, you never initialized your 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();
Upvotes: 1