Call Activity Method From Fragment

限于喜欢 提交于 2019-12-30 10:34:16

问题


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?


回答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




回答2:


From the fragment call your activity's method

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



回答3:


you have to Additional cast need to be done:

Activity activity123 = getActivity();

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



回答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.




回答5:


You can use a static object in your activity, and use it from the fragment, or call the getActivity() method in your fragment to access the whole activity objects/methods



来源:https://stackoverflow.com/questions/12070215/call-activity-method-from-fragment

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!