Android TabАктивность и изменение ориентации - PullRequest
3 голосов
/ 04 ноября 2011

У меня есть TabActivity, на котором размещены три других действия.

Если выбрана первая вкладка, я могу изменить ориентацию устройства, и все в порядке.

Если я перехожу на вторую или третью вкладку и меняю ориентацию, метод вложенной вкладки (вторая и третья) onCreate() вызывается дважды, в первый раз устанавливается настройка вкладки по умолчанию (первый), а во втором onCreate - установка содержимого выбранной вкладки (как это должно быть в первый раз).

Почему метод onCreate() вызывается дважды и как я могу решить проблему?

РЕДАКТИРОВАТЬ:

Я не хочу использовать android:configChanges="orientation" в манифесте, потому что я хочу, чтобы заголовок приложения и системная панель были внизу и на портрете, чтобы показать их, и это возможнотолько перед настройкой контента ...

Ответы [ 3 ]

1 голос
/ 12 ноября 2011

Просто чтобы мне было понятно, вы говорите, что у вас есть несколько вкладок, которые используют разные ориентации (книжная или альбомная), и у вас возникают проблемы при переключении вкладок и правильной настройке соответствующих ориентаций?

В ответ на комментарий Cata:

Да, поэтому при каждом повороте экрана текущая видимая активность уничтожается и снова вызывается onCreate (если я вспоминаю шаги).Вам нужно вызвать getCurrentTab (), который возвращает значение int, представляющее вкладку, и сбрасывает его в качестве активной вкладки при вызове onCreate.Вы можете сделать это несколькими способами ... либо с помощью небольшого метода, который обрабатывает только это, и вызывая его через onCreate, либо с помощью onSaveInstanceState (Bundle), чтобы сохранить ваши текущие данные, и onRestoreInstanceState (), чтобы перезагрузить данные вкладок.

Вы можете установить глобальное значение int (int currentTab = 0), не устанавливая его в onCreate (), а в своем методе onSaveInstanceState (Bundle) вы можете сохранить его на текущей вкладке (currentTab = getCurrentTab ()),затем в onRestoreInstanceState () вы можете установить его снова.

Имеет ли это смысл?

Имейте в виду, что я не проверял это, но готов сделать это, если вы не знакомы сэти два вызова методов.

Ниже приведен пример сохранения данных в Bundle - также напомним, что onCreate принимает этот пакет операций в качестве параметра.

@Override
public void onSaveInstanceState(Bundle outState){
    // Store UI state to the savedInstanceState.
    // This bundle will be passed to onCreate on next call.
    super.onSaveInstanceState(outState);
    String strMinSec = timer.getText().toString();
    String strMs = timerMs.getText().toString();
    long curElapstedTime = elapsedTime;
    boolean timerStopped = stopped;
    int orientation = this.getResources().getConfiguration().orientation;

    outState.putString("MinSec", strMinSec);
    outState.putString("Ms", strMs);
    outState.putLong("Elapsed", elapsedTime);
    outState.putBoolean("Stopped", timerStopped);
    outState.putInt("Orientation", orientation);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState){

    // Restore UI state from the savedInstanceState.
    if (savedInstanceState != null){
        String MinSec = savedInstanceState.getString("MinSec");
        if (MinSec != null)
        {
          timer.setText(MinSec);
        }
        String Ms = savedInstanceState.getString("Ms");
        if (Ms != null)
        {
          timerMs.setText(Ms);
        }
        long elapsed = savedInstanceState.getLong("Elapsed");
        if(elapsed > 0)
            elapsedTime = elapsed;
        int theOrientation = savedInstanceState.getInt("Orientation");
        //if(theOrientation > 0)
            //this.setRequestedOrientation(theOrientation); 
    }
}
1 голос
/ 04 ноября 2011

используйте атрибут android:configChanges="orientation" в файле манифеста, как показано ниже

<activity android:name=".Settings" android:screenOrientation="portrait"
            android:configChanges="orientation"></activity>
0 голосов
/ 13 ноября 2011

Я думаю, что лучшее решение состоит в том, чтобы выбрать другой подход, используя один Activity и поместить содержимое каждой вкладки в различные LinearLayout и onClick() методы вкладок (которые будут некоторыми кнопками) для переключениямежду макетами ...

Если у кого-то есть идея получше, пожалуйста, опубликуйте ее здесь!

Спасибо!

...