ActionbarSherlockのサンプルcom.actionbarsherlock.sample.fragmentsを実装しましたが、選択したタブに子フラグメントがあるときにデバイスの向きが変更されるまで、すべて正常に機能します。
すべて良い:
Tab1-> Fragment1
Tab2-> Fragment2
Tab3-> Fragment3
すべてが良好で、問題なくデバイスを回転させることができます。ここで、Fragment2のリストアイテムを選択してFragment2Child1をプッシュすると、デバイスを回転させるまですべて問題ありません。
デバイスが回転しているときは良くありません:
Tab1-> Fragment1
Tab2-> Fragment2-> Fragment2Child1
Tab3-> Fragment3
この時点で、タブとフラグメントが再作成されますが、Fragment2がFragment2Child1の下に表示されます。別のタブを選択するとさらに悪化します。その時点でFragment2は切り離されますが、Fragment2Child1は新しく選択されたタブフラグメントの下に表示されます。私はここでメカニズムをある程度理解していますが、回転後にFragment2をアタッチせず、別のタブが選択されたときにFragment2Child1(またはそれに関するフラグメント)をデタッチする方法を理解できません。
SherlockFragmentActivityを拡張するMainFragmentから
…</p>
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
mTabManager.addTab(mTabHost.newTabSpec("new").setIndicator(getString(R.string.new_)), NewListSupportActivity.NewListFragment.class, null);
mTabManager.addTab(mTabHost.newTabSpec("project").setIndicator(getString(R.string.project)), ProjectSupportActivity.ProjectListFragment.class, null);
mTabManager.addTab(mTabHost.newTabSpec("setting").setIndicator(getString(R.string.settings)), SettingSupportActivity.SettingListFragment.class, null);
if (savedInstanceState != null) {
mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab"));
}
} else {
…</p>
TabManagerクラスから
public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
tabSpec.setContent(new DummyTabFactory(this.mActivity));
final String tag = tabSpec.getTag();
final TabInfo info = new TabInfo(tag, clss, args);
// Check to see if we already have a fragment for this tab, probably
// from a previously saved state. If so, deactivate it, because our
// initial state is that a tab isn't shown.
info.fragment = this.mActivity.getSupportFragmentManager().findFragmentByTag(tag);
if (info.fragment != null && !info.fragment.isDetached()) {
final FragmentTransaction ft = this.mActivity.getSupportFragmentManager().beginTransaction();
ft.detach(info.fragment);
ft.commit();
}
this.mTabs.put(tag, info);
this.mTabHost.addTab(tabSpec);
}
@Override
public void onTabChanged(String tabId) {
TabInfo newTab = mTabs.get(tabId);
if (mLastTab != newTab) {
FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
if (mLastTab != null) {
if (mLastTab.fragment != null) {
ft.detach(mLastTab.fragment);
}
}
if (newTab != null) {
if (newTab.fragment == null) {
newTab.fragment = Fragment.instantiate(mActivity, newTab.clss.getName(), newTab.args);
ft.add(mContainerId, newTab.fragment, newTab.tag);
} else {
ft.attach(newTab.fragment);
}
}
mLastTab = newTab;
ft.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
}
そして、Fragment2Child1またはそのことについての任意の子をプッシュするコード
public void pushFragment(TradiesFragment current, TradiesFragment fragment) {
fragment.setFragmentListener(this);
final FragmentManager fm = this.fragment.getFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, android.R.anim.slide_in_left, android.R.anim.slide_out_right);
ft.detach(current);
ft.add(this.fragment.getId(), fragment);
ft.addToBackStack(null);
ft.commit();
}