shannon
shannon

Reputation: 589

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?

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

Answers (13)

Aram Saadollah
Aram Saadollah

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

Raymo111
Raymo111

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

Ashikh v u
Ashikh v u

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

Steve Marcus
Steve Marcus

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

RicardoSousaDev
RicardoSousaDev

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

Ahamadullah Saikat
Ahamadullah Saikat

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

f.trajkovski
f.trajkovski

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

Tmthetom
Tmthetom

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

Akash Arora
Akash Arora

Reputation: 71

Use this code in sub Fragment of MainActivity to call the method on it.

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

Upvotes: 3

Avadhani Y
Avadhani Y

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

Ruchira Gayan Ranaweera
Ruchira Gayan Ranaweera

Reputation: 35557

Initialize it first

MainActivity mActivity= new MainActivity();

Then you can continue

mActivity.startChronometer();

Upvotes: 4

Muhammad Aamir Ali
Muhammad Aamir Ali

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

PermGenError
PermGenError

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

Related Questions