1

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();
}
4

1 に答える 1

1

この問題に対する答えはありませんでした。少なくとも、私が考えることができたものは、まったく醜いものではありませんでした。解決策は、 Fragment2Child1をアクティビティでラップすることでした。Fragment2Child1Activityに移動すると、タブアクティビティが非表示になります。また、ユーザーは毎回メインアクティビティ(タブ付き)に戻る必要があります。良い面としては、実際にはUIがシンプルになります。

于 2012-10-09T03:59:14.100 に答える