VIRTUALVOID: ne, Fragmenty v Tabech řeším poprvé, s Androidem začínám. Použil jsem toto řešení:
http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/ jako základ. Jak jsem psal, některé taby jsou seznamy a ty můžou vyvolat fragment s detailem nebo fragment s dalším seznamem a ten zas fragment s detailem, to vše v rámci jedné záložky. Když se pak přepnu do jiného tabu, tak vymažu kompletně backstack v onTabChanged:
while (this.getSupportFragmentManager().getBackStackEntryCount() > 0) {
this.getSupportFragmentManager().popBackStackImmediate();
}
a dále události v aktivitě, které nahrazují právě fragmenty v tabech, např.:
public void onNewsItemClicked(long id) {
Bundle args = new Bundle();
args.putLong("id", id);
TabInfo newTab = (TabInfo) this.mapTabInfo.get("TabNewsDetail");
if (newTab == null) {
newTab = new TabInfo("TabNewsDetail", NewsDetailFragment.class, args);
this.mapTabInfo.put(newTab.tag, newTab);
}
if (newTab != null) {
if (newTab.fragment == null) {
newTab.fragment = Fragment.instantiate(this, newTab.clss.getName(), args);
} else {
newTab.fragment.setArguments(args);
}
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.realtabcontent, newTab.fragment, newTab.tag);
ft.addToBackStack(null);
ft.commit();
}
Ale zaboha nemůžu přijí na to, jak celý backstact obnovit :( V onCreate je v Bundle savedInstanceState v debuggeru vidět, že tam ty fragmenty jsou oba, ale nemám se jak na ně dostat, a ani když si dám vypsat nebo najít třeba ten fragments TabNewsDetail, tak to nic nenajde, zkoušel jsem různé:
if (savedInstanceState != null) {
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); //set the tab as per the saved state
Log.d("MainActivity", "onCreate, keyset: " + savedInstanceState.keySet());
/*FragmentManagerState b = savedInstanceState.get("android:support:fragments");
Log.d("MainActivity", "onCreate, b: " + String.valueOf(b));*/
Fragment f = this.getSupportFragmentManager().getFragment(savedInstanceState, "TabNewsDetail");
//Fragment f = this.getSupportFragmentManager().findFragmentByTag("TabNewsDetail");
Log.d("MainActivity", "onCreate, f: " + String.valueOf(f));
int count = this.getSupportFragmentManager().getBackStackEntryCount();
Log.d("MainActivity", "onCreate, entry count: " + String.valueOf(count));
for (int i = 0; i < count; i++) {
BackStackEntry entry = this.getSupportFragmentManager().getBackStackEntryAt(i);
Log.d("MainActivity", "onCreate, entry class name: " + entry.getClass().getName());
}
}
Dokonce je to tam uložené v nějaké třídě FragmentManagerState, která není známa, asi nějaká vnitřní privátní, ale ani vygooglit se mi ji nepovedlo.