@thorikiriのてょりっき

@thorikiriがWebとかAndroidとかの技術ネタや本を読んだブログです

ActionBarのタブでFragmentを切り替える

Android2.Xにも対応させるために、supportパッケージのFragmentとActionBarSerlockを使います。
onCreateでActionBarにタブを追加して、好きなタブを選択します。
すでに選択されているタブを再度選択した場合には、何もしないようにしています。
この時、選択されているタブは、getSupportActionBar().getSelectedTab().getPosition()で取得することが可能なのですが、初回に0が帰ってくるようなので、初期表示が出来ませんでした。
なので、メンバ変数にmSelectedTabPositionを保持するようにしています。
onCreateでTabを選択していますが、ここで普通にFragmentを設定するようにすれば問題ないとも言えますね。

public class SampleActivity extends SherlockFragmentActivity implements TabListener, FragmentManager.OnBackStackChangedListener {

    private Fragment mFragment;
    private int mSelectedTabPosition = -1; // 何番目のタブが選択されているか

    @Override
    public void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Theme_Sherlock);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.addOnBackStackChangedListener(this);

        // ActionBar
        final ActionBar actionBar = getSupportActionBar();
        actionBar.addTab(actionBar.newTab().setText("Tab 1").setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText("Tab 2").setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText("Tab 3").setTabListener(this));
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.getTabAt(0).select(); // 0番目のタブを選択しておく
    }

    @Override
    public void onBackStackChanged() {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction transaction) {
        int tabPosition = tab.getPosition();
        if (mSelectedTabPosition == tabPosition) {
            return;
        }
        mSelectedTabPosition = tabPosition;
        switch (tabPosition) {
        case 0:
            mFragment = Fragment.instantiate(this, Tab1Fragment.class.getName());
            transaction.add(R.id.fragment_container, mFragment);
            break;
        case 1:
            mFragment = Fragment.instantiate(this, Tab2Fragment.class.getName());
            transaction.add(R.id.fragment_container, mFragment);
            break;
        case 2:
            mFragment = Fragment.instantiate(this, Tab3Fragment.class.getName());
            transaction.add(R.id.fragment_container, mFragment);
            break;
        default:
            break;
        }
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction transaction) {
        transaction.remove(mFragment);
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction transaction) {
    }
}

Android API プログラミング・リファレンス [Android 2.3/3.x/4.0/4.1対応]

Android API プログラミング・リファレンス [Android 2.3/3.x/4.0/4.1対応]