У меня есть TabActivity с TabWidget TabHost внутри HorizontalScrollView.Я пытаюсь программно выбрать вкладку при изменении ориентации, чтобы, например, при переходе пользователя из портретного в альбомный режим активная вкладка оставалась прежней.
Что происходит, когда первая вкладка являетсяактивная вкладка (выделенная и выделенная), когда я меняю ориентацию, вторая вкладка становится активной вкладкой, когда моя активность снова запускается.Если со второй по n-ю вкладка является активной вкладкой при изменении ориентации, эта вкладка правильно становится активной вкладкой;проблема возникает только для первой вкладки.
Когда действие приостанавливается, я сохраняю тег активной вкладки в общих настройках системы, а при запуске действия извлекаю тег из предпочтений, чтобы использовать setCurrentTabByTag(string)
на TabHost.Проблема возникает, сохраняю ли я / восстанавливаю вкладку по индексу или по тегу.Проблема также возникает, если я использую onStop / onStart или onPause / onResume для сохранения и восстановления активной вкладки, соответственно.
Это не проблема, если TabWidget не находится внутри HorizontalScrollView, но не имеет HorizontalScrollView.не вариант (хотя мой пример кода показывает только 4 вкладки.)
Кроме того, мой пример показывает, что я программно создаю вкладки, потому что именно так мне нужно делать это в моем приложении;мои вкладки являются динамическими.
У меня такой вопрос: как сделать так, чтобы выбранная вкладка оставалась неизменной даже при изменении ориентации даже для первой вкладки?Пожалуйста, имейте в виду, что я должен создавать вкладки программно, и у меня должен быть TabWidget в HorizontalScrollView.
Вот мой макет main.xml:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<HorizontalScrollView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:fillViewport="true"
android:scrollbars="none">
<TabWidget android:id="@android:id/tabs"
android:layout_width="fill_parent" android:layout_height="wrap_content" />
</HorizontalScrollView>
<FrameLayout android:id="@android:id/tabcontent"
android:layout_width="fill_parent" android:layout_height="fill_parent" />
</LinearLayout>
</TabHost>
А вот мой TabActivity:
public class RestoreSelectedTabTestActivity extends TabActivity {
private static final String SELECTED_TAB_PREFERENCE_KEY = "selectedTabPref";
private static final String TAG = "RestoreTabTest";
private Context mApp;
private SharedPreferences mPrefs;
private TabHost mTabHost;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
super.onStart();
mApp = getApplicationContext();
mPrefs = PreferenceManager.getDefaultSharedPreferences(mApp);
mTabHost = (TabHost) findViewById(android.R.id.tabhost);
mTabHost.setup();
mTabHost.clearAllTabs();
addTab(1);
addTab(2);
addTab(3);
addTab(4);
// restore tab selection
String selectedTabTag = mPrefs.getString(
SELECTED_TAB_PREFERENCE_KEY, "");
Log.v(TAG, "restoring tab pref " + selectedTabTag);
mTabHost.setCurrentTabByTag(selectedTabTag);
}
@Override
protected void onStop() {
super.onStop();
// save tab selection
String selectedTabTag = mTabHost.getCurrentTabTag();
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString(SELECTED_TAB_PREFERENCE_KEY, selectedTabTag);
editor.commit();
Log.v(TAG, "saved tab pref " + selectedTabTag);
};
private void addTab(final int tabId) {
TabSpec tabSpec = mTabHost.newTabSpec("tab" + tabId);
tabSpec.setIndicator("Tab " + tabId);
tabSpec.setContent(new TabContentFactory() {
public View createTabContent(String tag) {
Log.v(TAG, "createTabContent " + tag);
TextView textView = new TextView(mApp);
textView.setText("This is Tab #" + tabId);
return textView;
}
});
Log.v(TAG, "addTab " + tabSpec.getTag());
mTabHost.addTab(tabSpec);
// required for setting focus programmatically
View tab = mTabHost.getTabWidget().getChildAt(
mTabHost.getTabWidget().getChildCount() - 1);
tab.setFocusableInTouchMode(true);
}
}
Редактировать: вот выход LogCat при переключении ориентации с выбранной первой вкладкой:
addTab tab1
createTabContent tab1
addTab tab2
addTab tab3
addTab tab4
restoring tab pref tab1
createTabContent tab2
Откуда вывод createTabContent tab2
в последней строке?
Любая помощь очень ценится.Заранее спасибо!