Call Activity Method From Fragment

13,153

Solution 1

This is a little bit more of a Java question and android.

If you looking at accessing the database, look at creating a database singleton.

So something like:

public class Database {

    // This starts off null
    private static Database mInstance;

    /**
     * Singleton method, will return the same object each time.
     */
    public static final Database getInstance() {
        // First time this method is called by Database.getInstance() from anywhere
        // in your App. It will create this Object once.
        if(mInstance == null) mInstance = new Database();
        // Returns the created object from a statically assigned field so its never
        // destroyed until you do it manually.
        return mInstance;
    }

    //Private constructor to stop you from creating this object by accident
    private Database(){
      //Init db object
    }

}

So then from your fragments and activities you can then place the following field in your class's (Better use use a base activity and fragment to save you repeating code).

public abstract class BaseFragment extends Fragment {

    protected final Database mDatabase = Database.getInstance();

}

Then your concrete fragments can extend your BaseFragment e.g. SearchListFragment extends BaseFragment

Hope this helps.

Worth reading about singletons and database

Regards, Chris

Solution 2

From the fragment call your activity's method

((MyActivity )  getActivity()).getClassX() ;

Solution 3

you have to Additional cast need to be done:

Activity activity123 = getActivity();

if(activity123 instanceof ParentActivity) {
    ((ParentActivity) activity123).someMethodInParentActivity();
}

Solution 4

Define an interface called Callbacks (or something else if you want). In it, have a public method called getClassX(). Then make your Activity implement the Callbacks interface.

In your Fragments, in onAttach, store a reference to a Callbacks object (i.e. your activity via something like:

if(activity instanceof Callbacks)
    mCallbacks = (Callbacks)activity;

This will guarantee that the Fragments are able to call the function. (in case you want to reuse the fragments later in another app)

Then in your Activity, in onCreate(), create an instance of ClassX. In your getClassX() method, just return a reference to it.

When you want a reference to it from your Fragments, call mCallbacks.getClassX() and you should be sorted.

Share:
13,153
user1315621
Author by

user1315621

Updated on June 04, 2022

Comments

  • user1315621
    user1315621 about 2 years

    I'm dealing with fragments.
    I have an Activity and different fragments.
    Each fragment need the access to a Class(call it X) that allow it to access a database, but, because I have a lot of fragments, I don't want to create a different instance of the Class X in every fragment as I think it will require lots of memory.
    So how can I do?
    I wrote something like this (with a getter), but it doesn't work!

    public class MyActivity {
      private ClassX classx;
    
      .....
    
      public ClassX getClassX() {
         return classx;
      }   
      .....
    }
    

    But than, how can I call it from the fragment?