问题
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