android:configChanges=orientation|screenSize изменяет внешний вид моего макета

У меня есть класс Adapter и класс MainActivity. Класс Adapter отображает список имен детей, а рядом с именами показывает time, что они прибыли в школу. Проблема в том, что когда я поворачиваюсь к альбомной ориентации, значения time теряются.

Я подумал о добавлении в свой манифест под MainActivity

android:configChanges="orientation|keyboardHidden|screenSize"

Что происходит, так это то, что значения времени не теряются в ландшафтном режиме, но внешний вид макета выглядит так же, как и в портретном режиме. В реальности альбомная раскладка выглядит несколько иначе, чем портретная.

Что мне делать в этом случае, чтобы получить значения time, а также сохранить внешний вид ландшафтного макета.


person Mark023    schedule 12.07.2016    source источник


Ответы (2)


Есть 2 варианта:

  1. используйте метод onSaveInstanceState(Bundle outState) в своей деятельности или фрагменте - чтобы сохранить ваши данные и восстановить их после ротации (в onCreate(Bundle savedInstanceState) или onRestoreInstanceState(Bundle savedInstanceState))

Пример:

 @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putSerializable("time_data", (Seriazable) mTimeList);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...

        if (savedInstanceState != null) {
            // restore value of members from saved state
            mTimeList = savedInstanceState.getSerializable("time_data");
        }

        ...
    }
  1. используйте android:configChanges, как вы уже использовали для самостоятельной обработки изменений, но раздуйте альбомную компоновку после поворота

Пример:

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

Я предпочитаю первый вариант, а также предложенный в руководстве по Android.

person comrade    schedule 12.07.2016
comment
Спасибо :), если я использую второе ваше решение, в onConfigurationChanged() в случае если мне нужно установить layout-land xml для класса адаптера. Как это сделать - person Mark023; 12.07.2016
comment
Вы можете проверить этот ответ StackOverflow, связанный с инфляцией макета после изменения конфигурации. В StackOverflow есть еще несколько вопросов, связанных с инфляцией макета, поэтому вы можете проверить их и использовать то, что более применимо для ваших целей. - person comrade; 12.07.2016

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

 <activity android:name=".MainActivity"
            android:screenOrientation="portrait">
  </activity>
person Sagar Chavada    schedule 12.07.2016