HorizontalScrollView внутри TabHost вызывает проблемы при переключении ориентации - PullRequest
1 голос
/ 12 ноября 2011

У меня есть 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 в последней строке?

Любая помощь очень ценится.Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...