3

私はActionBarSherlockを使用しており、Android 開発者サイトで見つけたタブ ナビゲーションにこのパターンを適用しています。それはかなりうまくいっていますが、タブとフラグメントの間の関連付けを切り替えNAVIGATION_MODE_TABSて保持できるようにしたいです。NAVIGATION_MODE_LIST

上で述べたパターンは、一般的なコードを保持するのに非常に適しています。そこで、リスナーをタブに追加し、次のように特定のフラグメントに関連付けます。

bar.addTab(bar.newTab()
.setText("MyFragment")
.setTabListener(new TabListener<SomeFragment>(this, "myfargment", SomeFragment.class)));

ジェネリックを使用して、関連するタブがクリックされたときにフラグメントをインスタンス化します。

public void onTabSelected(Tab tab, FragmentTransaction ft) {
    if (mFragment == null) {
        mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
        ft.add(android.R.id.content, mFragment, mTag);
    } else {
        ft.attach(mFragment);
    }
}

私の質問はリスト ナビゲーションモードでフラグメント間を移動するときに、どうすれば同様の方法を実現できるかということです。ActionBar のリストの for は、tablistener のように項目ごとではなく、リスト全体に対して機能するため、同様の方法を見つけることができませんでした。OnNavigationListener

または、次のようなことをしなければなりませんか:

@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
    switch (itemPosition) {
    case 0:
    //Replace the current fragment with FragmentA
        break;
    case 1:
    //Replace the current fragment with FragmentB
        break;
    case 2:
    //Replace the current fragment with FragmentC
        break;
    default:
        break;
    }
    return true;
}

編集:

興味深い動作に気付きました:ナビゲーション モードが に設定されてNAVIGATION_MODE_TABSいる場合、携帯電話を横向きモードにすると、タブがリストに変換され、フラグメントとリスト項目 (以前はタブ項目でした)の間の関連付けが維持されます。向きの変更ではなくオンデマンドでこの結果を達成しますか?

4

1 に答える 1

1

タブモードで手動でリストナビゲーションに設定することは可能だとは思いません。アプリケーションの 1 つが「大」バケットを下回ったときに、そのアプリケーションのリスト ナビゲーションを設定しました。これは、ナビゲーション リスナーの使用方法です。

OnNavigationListener mNavigationListener = new OnNavigationListener()
{
int mLastPosition = -1;

@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId)
{
    String selectedTag = mFragmentNames.get(itemPosition);

    FragmentManager fm = getSupportFragmentManager();
    Fragment fragment = fm.findFragmentByTag(selectedTag);
    FragmentTransaction ft = fm.beginTransaction();

    /** Used to avoid the same fragment being reattached. */
    if(mLastPosition != itemPosition)
    {
    /** Means there was a previous fragment attached. */
    if(mLastPosition != -1)
    {
        Fragment lastFragment = fm.findFragmentByTag(mFragmentNames.get(mLastPosition));
        if(lastFragment != null)
        ft.remove(lastFragment);
    }

    if(fragment == null)
    {
        /** The fragment is being added for the first time. */
        fragment = Fragment.instantiate(HomeActivity.this, selectedTag);
        ft.add(R.id.rootLayout, fragment, selectedTag);
        ft.commit();
    } else
    {
        ft.attach(fragment);
        ft.commit();
    }
    }
    /**
     * The newly attached fragment will be the last position if changed.
     */
    mLastPosition = itemPosition;

    return true;
}
};

変数 mFragmentNames は、整数位置をフラグメント名 ex にマップする HashMap です。「com.android.myproject.MyFragment」

これが役立つことを願っています。

于 2012-09-06T17:45:54.980 に答える