Вкладки Android ActionBar устанавливают изначально выбранную вкладку
Я заметил, что при использовании
actionBar.setSelectedNavigationItem(x)
в методе 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 не выбирает вкладку в позиции 0 сначала при использовании actionBar.setSelectedNavigationItem(position).
6 ответов
Используйте другой addTab
призывает переопределить это поведение. Сначала вам нужно будет добавить вкладку, которую вы хотите выбрать (в вашем случае вкладка в позиции 2). Соответствующий Javadoc
actionBar.addTab(tab2);
actionBar.addTab(tab0, 0, false);
actionBar.addTab(tab1, 1, false);
Для всех остальных, желающих это сделать, вы также можете установить вкладку на выбранную, установив положение, а затем установить 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
Вы можете использовать приведенную ниже оценку в методе activsty 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 вкладки (т.е. вкладка 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.
Ответ Перси Веги кажется лучшим рабочим решением.
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);
}
Ответ 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());
Таким образом, параметр setSelected имеет значение true, только если mTabSelected равен индексу вкладки.