Нет данных после вызова setContentView () - PullRequest
1 голос
/ 13 июня 2011

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

Моя первая проблема состояла в том, что после поворота приложение перезапустилось, и номер был указан там, где он был сброшен.

Это было легко исправить после нахождения этого вопроса здесь на stackoverflow.

Я реализовал следующее решение для этой проблемы:

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

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

public void setGui() {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        initWheel(R.id.money1, 0, 9, "%1d", moneyWidthPortrait, textSizePortrait);
        ...
    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        initWheel(R.id.money1, 0, 9, "%1d", moneyWidthLandscape, textSizeLandscape);
        ...
    }
}

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

public void setGui() {
    if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        setContentView(portrait);
        ...
    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(landscape);
        ...
    }
}

Но после вызова setContentView все данные снова теряются, и после изменения ориентации телефона колеса сбрасываются в ноль.

Что было бы наилучшим, чтобы избежать сброса колес на «0» во время изменения ориентации и компоновки?

РЕДАКТИРОВАТЬ: редактирует после ответа

Я удалил:

android:configChanges="keyboardHidden|orientation"

и добавлено:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  savedInstanceState.putInt("WheelMoney1", getWheelValue(R.id.money1));
  ...
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  getWheel(R.id.money1).setCurrentItem(savedInstanceState.getInt("WheelMoney1"), false);
  ...
}

И реализованы layout-land и layout-port для обработки двух разных макетов.

Ответы [ 2 ]

3 голосов
/ 13 июня 2011

Похоже, вам нужно реализовать onSaveInstanceState и onRestoreInstanceState

2 голосов
/ 13 июня 2011

Вам не нужно звонить setContentView при смене ориентации. Android сделает это за вас, если вы сохраните макет с тем же именем в правильном каталоге макета. Например:

res/layout-land/main.xml
res/layout-port/main.xml

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

...