Android-взгляды и пользовательская ориентация, как лучше всего справиться? - PullRequest
1 голос
/ 28 марта 2012

У меня есть приложение для Android с несколькими представлениями.Я отключил автоматическое переключение ориентации, объявив android:configChanges="keyboardHidden|orientation|screenSize" для своей активности.

Q1) Как мне повторно активировать виды в onConfigurationChanged()?Кажется, мне нужно сбросить представление содержимого, используя метод setContentView.Есть ли альтернативный способ сигнализировать о том, что теперь вы должны раздуть альбомную / альбомную версию макета?Некоторые из моих представлений содержат довольно сложные states/modeless диалоговые окна и т. Д., Которые могут появляться в любое время, поэтому удаление объекта представления и повторное создание его экземпляра просто не звучат правильно.

Q2) Какой лучший способ в onConfigurationChanged()чтобы узнать, какое представление нам действительно нужно активировать, т.е. что было сфокусировано, когда началось изменение ориентации?Я не хочу полагаться на getCurrentFocus(), так как иногда он может быть нулевым.

1 Ответ

1 голос
/ 28 марта 2012

Q1) Как мне повторно активировать представления в onConfigurationChanged ()?

Как вы упомянули, setContentView() - хороший способ сделать это. Просто помните, что не всегда передавать макет XML этому методу. Вместо этого предварительно накачайте макет в объект View и передайте этот объект View в setContentView. Таким образом, вы не несете затрат на воссоздание объекта просмотра при каждом изменении ориентации.

Ниже приведен пример кода - может не работать как есть; но хотел проиллюстрировать мою точку зрения.

View mLandscapeView;
View myPortraitView

protected void onCreate(Bundle bundle){
    View myLandscapeView = getLayoutInflater().inflate(R.layout.my_landscape, null);
    View myPortraitView = getLayoutInflater().inflate(R.layout.my_portrait, null);
    //...
}

@Override
protected void onConfigurationChanged(Configuration config){
    if(config.orientation = Configuration.ORIENTATION_LANDSCAPE){
        //adjust mLandscapeView as needed
        setContentView(mLandscapeView);
    }

    // And so on ... 

}
...