2012-02-14 4 views
1

У меня есть приложение Activity в моем приложении для Android, которое устанавливает различные XML-схемы разметки в зависимости от ориентации. Я объявил android:configChanges="orientation" в манифесте. Теперь вызывается - но к этому времени новая ориентация уже вступила в силу.Сохранение состояния _before_ изменение ориентации при андроиде: configChanges = "ориентация" указана

Моя цель - попытаться подключиться к жизненному циклу и попытаться сэкономить некоторые изменения до действует новая ориентация; так что я могу восстановить состояние, когда вернусь к текущей ориентации.

Я взломал его следующим образом, но я не уверен, что это правильный способ сделать это. Моя процедура включает сохранение состояния в , а затем вызов setContentView() для установки макета для новой ориентации.

public class SwitchOrientationActivity extends Activity { 

    private View mLandscape, mPortrait; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     LayoutInflater li = LayoutInflater.from(this); 
     mLandscape = li.inflate(R.layout.landscape, null); 
     mPortrait = li.inflate(R.layout.portrait, null); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 

     if (Configuration.ORIENTATION_LANDSCAPE == newConfig.orientation) { 
      switchToLandscape(); 
     } else { 
      switchToPortrait(); 
     } 
    } 

    private void switchToPortrait() { 

     /* 
     * Use mLandscape.findViewById() to get to the views and save the values 
     * I'm interested in. 
     */ 
     saveLanscapeState(); 
     setContentView(mPortrait); 
    } 

    private void switchToLandscape() { 
     /* 
     * Use mPortrait.findViewById() to get to the views and save the values 
     * I'm interested in. 
     */ 
     savePortraitState(); 
     setContentView(mLandscape); 

    } 
} 

Есть ли более элегантный способ достичь этого?

+0

Поскольку изменение ориентации приводит к уничтожению и воссозданию активности, вы всегда можете сохранить в методах onPause, onStop или onDestroy? –

+0

@Nick Campion: если вы объявляете андроид: configChanges = "ориентация" в файле манифеста, активность больше не уничтожается/не создается при изменении ориентации –

+0

А, я кое-что узнал. –

ответ

0

android:configChanges="orientation" заставляет вашу деятельность не перезапускаться при изменении ориентации и поэтому пропускает обычный жизненный цикл для этого. Я бы предложил, вы это вынимаете, затем реализуете onRetainNonConfigurationInstance() и восстанавливаете свое состояние в onCreate или onRestoreInstanceState. См. Это article для получения дополнительной информации

+0

На самом деле, мне не нужно, чтобы моя активность перезапускалась или воссоздавалась при изменении ориентации. Я хочу, чтобы он переключался между двумя разными макетами - каждый из них предлагал отдельную функциональность (портрет отображает некоторые значения с использованием графики, а пейзаж отображает историческую карту значений). Кроме того, даже если бы я должен был использовать 'onRetainNonConfigurationInstance()', мне все равно нужно было бы сохранять «Просмотры» там, чтобы он ввел риск утечки памяти. – curioustechizen

Смежные вопросы