我在HorizontalScrollView中有TabHctivity和TabHost的TabWidget。我试图在方向更改时以编程方式选择选项卡,以便当用户从纵向更改为横向时,例如,活动选项卡保持不变。
当我更改方向时,当第一个选项卡是活动选项卡(选中并聚焦)时,第二个选项卡将成为活动开始备份时的活动选项卡。如果方向更改时第二个到第n个选项卡是活动选项卡,则该选项卡正确成为活动选项卡;问题仅发生在第一个选项卡上。
当活动暂停时,我将活动标签的标签保存在系统共享首选项中,当活动开始时,我从首选项中获取标签,以便在TabHost上使用setCurrentTabByTag(string)
。无论是按索引还是按标记保存/恢复选项卡,都会出现问题。无论是使用onStop / onStart还是onPause / onResume分别保存和恢复活动选项卡,都会出现问题。
如果TabWidget不在HorizontalScrollView中,但不是HorizontalScrollView不是一个选项(即使我的代码示例只显示4个选项卡),这不是问题。
此外,我的示例显示我以编程方式创建选项卡,因为这是我需要在我的应用程序中执行此操作;我的标签很动态。
我的问题是:当我更改方向时,即使是第一个标签,如何让选定的标签保持不变?请记住,我必须以编程方式创建选项卡,并且我必须在HorizontalScrollView中使用TabWidget。
这是我的布局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
输出来自哪里?
非常感谢任何帮助。提前谢谢!