22

使っていて気づいたこと

actionBar.setSelectedNavigationItem(x)

私のアクティビティの onCreate() メソッドでは、位置 0 のタブ項目が常に最初に選択され、次に位置 x のタブ項目が読み込まれます。これは、(フラグメントを使用しているため) 2 つのフラグメントがロードされることを意味します。そのうちの1つは不要です...

これが私のコードです:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Determine which bundle to use; either the saved instance or a bundle
    // that has been passed in through an intent.
    Bundle bundle = getIntent().getExtras();
    if (bundle == null) {
        bundle = savedInstanceState;
    }

    // Initialize members with bundle or default values.
    int position;
    if (bundle != null) {
        position = bundle.getInt("selected_tab");
    } else {
        position = 0;
    }

    // Set the tabs.
    ActionBar actionBar = getActionBar();
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    Tab tab = actionBar
            .newTab()
            .setText("Tab 1")
            .setTabListener(
                    new TabListener<RendersGridFragment>(this, "1",
                            RendersGridFragment.class));
    actionBar.addTab(tab);

    tab = actionBar
            .newTab()
            .setText("Tab 2")
            .setTabListener(
                    new TabListener<RendersGridFragment>(this, "2",
                            RendersGridFragment.class));
    actionBar.addTab(tab);

    tab = actionBar
            .newTab()
            .setText("Tab 3")
            .setTabListener(
                    new TabListener<RendersGridFragment>(this, "3",
                            RendersGridFragment.class));
    actionBar.addTab(tab);

    actionBar.setSelectedNavigationItem(position);
}

デフォルトでは、最初は位置 0 のタブが選択されているようです。しかし、ご覧のとおり、アクティビティ onCreate() メソッドが再度実行されたときに、最後に選択されたタブがまだ選択されていることを確認するために、バンドルを渡しています。

たとえば、最後に選択されたタブが位置 2 にある場合、onCreate() が実行され、位置 0 のタブが読み込まれ、次に位置 2 のタブが読み込まれます。

actionBar.setSelectedNavigationItem(position) を使用するときに、ActionBar が最初に位置 0 のタブを選択しないようにするにはどうすればよいですか。

4

6 に答える 6

34

addTabこの動作をオーバーライドするには、他の呼び出しを使用します。最初に選択したいタブを追加する必要があります(あなたの場合、位置2のタブ)。関連するJavadoc

actionBar.addTab(tab2);
actionBar.addTab(tab0, 0, false);
actionBar.addTab(tab1, 1, false);
于 2012-03-27T19:09:01.827 に答える
18

これを行う他の人のために、位置を設定してタブを選択済みに設定し、true または false を設定してどのタブを選択するかを示すこともできます

actionBar.addTab(tab1, 0, false);
actionBar.addTab(tab2, 1, true);
actionBar.addTab(tab3, 2, false);

このアプローチに関するドキュメントは次のとおりです。http://developer.android.com/reference/android/app/ActionBar.html#addTab(android.app.ActionBar.Tab, int, boolean)

于 2012-09-18T00:11:06.093 に答える
3

activtiy onStartメソッドで以下のステートメントを使用できます。

protected void onStart() {
    super.onStart();
    actionBar.selectTab(mainTab);
}

ここの mainTab 変数は Tab 型です。この方法では、次のようにタブをクラス全体の変数として定義する必要があります。

Tab mainTab, tab2,tab3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    //add tabs to action bar
    ....
}
于 2013-09-26T08:41:34.980 に答える
2

3 つのタブ (つまり、タブ 0、タブ 1、タブ 2) があり、タブ 1 を事前に選択したい場合。これを行う:

for (int i = 0; i < mFragmentPagerAdapter.getCount(); i++) {
    boolean preselected = (i == 1);
    actionBar.addTab(actionBar.newTab().setText(
        mFragmentPagerAdapter.getPageTitle(i)).setTabListener(this), preselected);
}

以下を使用します。

public abstract void addTab (ActionBar.Tab tab, boolean setSelected)

この API 仕様に従って。

于 2014-01-26T22:49:28.610 に答える
0

Percy Vega の返信は、最善の解決策のようです。

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {

        boolean preselected = (i == ErrorDetails.tab_id);
        actionBar.addTab(
                actionBar.newTab()
                        .setText(mSectionsPagerAdapter.getPageTitle(i))
                        .setTabListener(this),preselected);
    }
于 2015-09-01T14:34:11.220 に答える
0

bkurzius の回答は、同じ問題で抱えていた問題を解決するのに役立ちました。

私がしたことは:

private final String TAB_SELECTED = "tab_selected"
...
private int mTabSelected;
...
mTabSelected = savedInstanceState.getInt(TAB_SELECTED);
...
final ActionBar actionbar = getActionBar();
...
actionbar.addTab(tab1, mTabSelected == 0);
actionbar.addTab(tab2, mTabSelected == 1);
actionbar.addTab(tab3, mTabSelected == 2);
...
outState.putInt(TAB_SELECTED, getActionBar().getSelectedNavigationIndex());

このように、mTabSelected がタブのインデックスと等しい場合にのみ、setSelected パラメータが true になります。

于 2014-04-03T12:36:17.213 に答える