Android ActionBar 选项卡设置最初选择的选项卡
Posted
技术标签:
【中文标题】Android ActionBar 选项卡设置最初选择的选项卡【英文标题】:Android ActionBar tabs set initially selected tab 【发布时间】:2012-04-11 08:43:14 【问题描述】:我注意到在使用时
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 的选项卡。
【问题讨论】:
【参考方案1】:使用其他 addTab
调用来覆盖此行为。您需要先添加要选择的选项卡(在您的情况下,位置 2 的选项卡)。 Relevant Javadoc
actionBar.addTab(tab2);
actionBar.addTab(tab0, 0, false);
actionBar.addTab(tab1, 1, false);
【讨论】:
太完美了。我想有一个简单的解决方法。谢谢。 它可以工作,但我可以在创建活动时看到 ViewPager 的转换。有什么办法,如何禁用它? 我不确定我是否遇到了与问题作者相同的问题。在我的情况下,在我的 Activity 的 onCreate 上调用函数 setSelectedNavigationItem(...) 时,片段被实例化了两次或更多次。为此改变解决了我的问题。谢谢。【参考方案2】:对于任何其他想要这样做的人,您还可以通过设置位置将选项卡设置为选中,然后设置 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)
【讨论】:
【参考方案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
....
【讨论】:
【参考方案4】:如果您有 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)
根据this API specification。
【讨论】:
【参考方案5】: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 参数才为真。
【讨论】:
您的 mTabSelected 应该是 int 而不是 boolean。【参考方案6】: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);
【讨论】:
以上是关于Android ActionBar 选项卡设置最初选择的选项卡的主要内容,如果未能解决你的问题,请参考以下文章
Android - 使用 ViewPager 和 FragmentStatePagerAdapter 为 ActionBar 创建多级选项卡
在 Android 4 上自定义 ActionBar 选项卡