2010-10-23 2 views
2

У меня есть активность, которая обрабатывает изменения конфигурации. Но теперь мне нужно изменить layout.I пробовал в onConfigurationChanged callback только для того, чтобы снова установить макет, и надеется получить правильную раскладку (земля), но он все еще показывает первый макет для портретного вида (там два макета (одно имя) размещен в res/ макет и res/layout-land :)onConfigurationChanged-it по-прежнему показывает первый макет

, если я удалю андроид: configChanges = "ориентация", это должно быть, но ı нужно обрабатывать onConfigurationChanged. Что мне делать??

ответ

15

Если у Вас есть свой портрет макет main.xml в /res/layout и ваш ландшафтный макет main.xml в /res/layout-land, и ваш выглядит следующим образом:

public void onConfigurationChanged(Configuration newConfig) { 
      super.onConfigurationChanged(newConfig);     
      setContentView(R.layout.main); 
    ... 
    ... 
    ... 

    } 

И в манифесте вы должны иметь android:configChanges="keyboardHidden|orientation"

Затем он должен работать нормально, как это делает в моем приложении. Это то, что вы делаете?

+1

да это работает отлично :)) спасибо ... Я хочу спросить, почему мы должны написать keyboardHidden ?? – atasoyh

+5

Я думаю, потому что на некоторых устройствах, когда кто-то открывает слайд, клавиатура также автоматически меняет ориентацию. – ShadowGod

+0

+1 его рабочий штраф –

3
// In your activity code. 
int mCurrentOrientation; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mfo_offers); 
    ........ 
    mCurrentOrientation = getCurrentOrientation(); 
} 
@Override  
public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     // You may handle different configuration changes in your activity which configured in your mainfest.xml, you only need to recreate layout when orientation changes. 
     if(mCurrentOrientation != newConfig.orientation) {   
      recreate(); // This recreate the activity if you can properly restore your activity state. 
     } 
     ...... 
} 

См Activity.recreate() здесь: http://developer.android.com/reference/android/app/Activity.html#recreate()

+0

public void recreate() (добавлен в уровень API 11) Вызывает эту активность для воссоздания с новым экземпляром. Это приводит, по существу, к тому же потоку, что и при создании Activity из-за изменения конфигурации - текущий экземпляр перейдет через свой жизненный цикл в onDestroy() и затем создаст новый экземпляр, созданный после него. – evanchin

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