我注意到使用
时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选择制表符。
答案 0 :(得分:34)
使用其他addTab
调用来覆盖此行为。您需要先添加要选择的选项卡(在您的情况下,位置2处的选项卡)。 Relevant Javadoc
actionBar.addTab(tab2);
actionBar.addTab(tab0, 0, false);
actionBar.addTab(tab1, 1, false);
答案 1 :(得分:18)
对于任何其他想要这样做的人,您也可以通过设置位置将标签设置为选中,然后设置为true或false以指示应选择哪个标签
actionBar.addTab(tab1, 0, false);
actionBar.addTab(tab2, 1, true);
actionBar.addTab(tab3, 2, false);
答案 2 :(得分:3)
您可以在激活 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
....
}
答案 3 :(得分: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)
答案 4 :(得分: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参数才为真。
答案 5 :(得分: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);
}