22

我注意到在使用时

actionBar.setSelectedNavigationItem(x)

在我的 Activity 的 onCreate() 方法中,始终首先选择位置 0 的选项卡项,然后加载位置 x 的选项卡项。这意味着(因为我使用的是片段)加载了 2 个片段。其中一个是不必要的......

这是我的代码:

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

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

这样,只有当 mTab​​Selected 等于选项卡的索引时,setSelected 参数才为真。

于 2014-04-03T12:36:17.213 回答
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 回答