TabHost中的Horizo​​ntalScrollView导致方向切换问题

时间:2011-11-12 04:26:23

标签: android android-layout

我在Horizo​​ntalScrollView中有TabHctivity和TabHost的TabWidget。我试图在方向更改时以编程方式选择选项卡,以便当用户从纵向更改为横向时,例如,活动选项卡保持不变。

当我更改方向时,当第一个选项卡是活动选项卡(选中并聚焦)时,第二个选项卡将成为活动开始备份时的活动选项卡。如果方向更改时第二个到第n个选项卡是活动选项卡,则该选项卡正确成为活动选项卡;问题仅发生在第一个选项卡上。

当活动暂停时,我将活动标签的标签保存在系统共享首选项中,当活动开始时,我从首选项中获取标签,以便在TabHost上使用setCurrentTabByTag(string)。无论是按索引还是按标记保存/恢复选项卡,都会出现问题。无论是使用onStop / onStart还是onPause / onResume分别保存和恢复活动选项卡,都会出现问题。

如果TabWidget不在Horizo​​ntalScrollView中,但不是Horizo​​ntalScrollView不是一个选项(即使我的代码示例只显示4个选项卡),这不是问题。

此外,我的示例显示我以编程方式创建选项卡,因为这是我需要在我的应用程序中执行此操作;我的标签很动态。

我的问题是:当我更改方向时,即使是第一个标签,如何让选定的标签保持不变?请记住,我必须以编程方式创建选项卡,并且我必须在Horizo​​ntalScrollView中使用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输出来自哪里?

非常感谢任何帮助。提前谢谢!

0 个答案:

没有答案