问题
I have an Activity that Displays Fragments one at a time , now each fragment load it data from server and keep fetching data in a list , the user can display another fragment in the activity by selecting an item in the Spinner that displayed in the ActonBar.
here is the code for the Activity
public class HomeActivity extends SherlockFragmentActivity .....{
private class ListInfo {
private String tag;
private Class<?> clss;
private Bundle bundle;
private Fragment fragment;
public ListInfo(String tag, Class<?> clss, Bundle bundle) {
this.tag = tag;
this.clss = clss;
this.bundle = bundle;
}
}
String[] naviStrings;
private HashMap<String, ListInfo> listMap = new HashMap<String, HomeActivity.ListInfo>();
private ListInfo mLastListInfo = null;
private int currentSelectedOptionInSpinner;
ChannelFragment fr;
@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
Log.d("HomeActivity", "onCreate");
Log.d("onCreate bundle", "" + arg0);
setContentView(R.layout.test);
naviStrings = getResources().getStringArray(
R.array.action_bar_spinner_entries);
initializeList(arg0);
Context context = getSupportActionBar().getThemedContext();
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
context, R.array.action_bar_spinner_entries,
R.layout.sherlock_spinner_item);
adapter.setDropDownViewResource(R.layout.sherlock_spinner_dropdown_item);
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
getSupportActionBar().setListNavigationCallbacks(adapter, this);
getSupportActionBar().setSelectedNavigationItem(
currentSelectedOptionInSpinner);
}
private void initializeList(Bundle args) {
ListInfo listInfo = null;
// add first Fragment
listMap.put(naviStrings[5], (listInfo = new ListInfo(naviStrings[5],
AboutUsActivity.class, args)));
addFragmentToList(this, listInfo);
listMap.put(naviStrings[3], (listInfo = new ListInfo(naviStrings[3],
Fragment1.class, args)));
addFragmentToList(this, listInfo);
listMap.put(naviStrings[2], (listInfo = new ListInfo(naviStrings[2],
Fragment2.class, args)));
addFragmentToList(this, listInfo);
listMap.put(naviStrings[1], (listInfo = new ListInfo(naviStrings[1],
Fragment3.class, args)));
addFragmentToList(this, listInfo);
listMap.put(naviStrings[4], (listInfo = new ListInfo(naviStrings[4],
Fragment4.class, args)));
addFragmentToList(this, listInfo);
if (args != null) {
Toast.makeText(this, "args is not null", Toast.LENGTH_SHORT).show();
// set the current selected index in the ActionBar spinner
if (args.getInt(
ApplicationMetaData.IntentData.LAST_SELECTED_ITEM_SPINNER,
-1) > -1
&& args.getInt(
ApplicationMetaData.IntentData.LAST_SELECTED_ITEM_SPINNER,
-1) < naviStrings.length) {
Toast.makeText(this, "selected is not null",
Toast.LENGTH_SHORT).show();
currentSelectedOptionInSpinner = args
.getInt(ApplicationMetaData.IntentData.LAST_SELECTED_ITEM_SPINNER);
} else {
currentSelectedOptionInSpinner = 2;
}
} else {
currentSelectedOptionInSpinner = 2;
}
onNavigationItemSelected(currentSelectedOptionInSpinner, 0);
}
private static void addFragmentToList(SherlockFragmentActivity activity,
ListInfo instanse) {
// check to see if we already have a fragment for this tab , probably
// from a previously save state.
// if so deactivated it ,because our initial state is that a tab is not
// shown.
String tag = instanse.tag;
instanse.fragment = activity.getSupportFragmentManager()
.findFragmentByTag(tag);
if (instanse.fragment != null && !instanse.fragment.isDetached()) {
FragmentTransaction ft = activity.getSupportFragmentManager()
.beginTransaction();
ft.detach(instanse.fragment);
ft.commit();
activity.getSupportFragmentManager().executePendingTransactions();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(
ApplicationMetaData.IntentData.LAST_SELECTED_ITEM_SPINNER,
currentSelectedOptionInSpinner);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
Log.d("onNavigationItemSelected", "" + itemPosition);
if (itemPosition == 5) {
Intent i = new Intent(this, AboutUsActivity.class);
startActivity(i);
return true;
}
Log.d("fragment data", listMap.get(naviStrings[itemPosition]) + "");
ListInfo newtItem = listMap.get(naviStrings[itemPosition]);
if (newtItem != mLastListInfo) {
FragmentTransaction ft = this.getSupportFragmentManager()
.beginTransaction();
if (mLastListInfo != null) {
if (mLastListInfo.fragment != null) {
ft.detach(mLastListInfo.fragment);
}
}
if (newtItem != null) {
if (newtItem.fragment == null) {
// create and add
newtItem.fragment = Fragment.instantiate(this,
newtItem.clss.getName(), newtItem.bundle);
ft.add(android.R.id.content, newtItem.fragment,
newtItem.tag);
} else {
ft.attach(newtItem.fragment);
}
}
mLastListInfo = newtItem;
ft.commit();
this.getSupportFragmentManager().executePendingTransactions();
return true;
}
return false;
}}
now when i navigate from one fragment to another lets say from Fragment1 to Fragment2 when i return back to fragment1 it preserve it state and does not have to load it data from the beginning , but if i start a new Activity from the home Activity the system destroy the Activity and the Fragments in it , is There a way to preserve these Fragment note when i rotate the Home Activity nothing happened , only if i start a new Activity ??????
UPDATE
in all of the Four Fragment i make in the onCreate
setRetaineInstance(true);
回答1:
One option is to override saveInstanceState in your Fragments
and/or Activites
in order to persist data and later retrieve it from the Bundle
that gets passed into onActivityCreated
/onCreate
.
If you are dealing with large sets of data, you may be better off using another persistence mechanism like the SQLite database
来源:https://stackoverflow.com/questions/12331787/save-fragment-objects