Call Activity Method From Fragment
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.
user1315621
Updated on June 04, 2022Comments
-
user1315621 about 2 years
I'm dealing with fragments.
I have anActivity
and differentfragments
.
Eachfragment
need the access to aClass(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 theClass X
in every fragment as I think it will require lots ofmemory
.
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
?