Android: изменение конфигурации не обновляется - PullRequest
3 голосов
/ 01 февраля 2012

Я использую тег XML

android:configChanges="orientation|keyboardHidden|keyboard"

и следующий код для обнаружения изменений ориентации устройства и изменения макетов:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    disp = getWindowManager().getDefaultDisplay();
    swidth = disp.getWidth();
    sheight = disp.getHeight();
    parent.removeAllViews();
    parent = new RelativeLayout(this);
    if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
        layoutPortrait();
    else
        layoutLandscape();
}

Это прекрасно работает при переходе от портрета к ландшафту.Но по какой-либо причине переход от пейзажа к портрету (начиная с пейзажа или переключение на него, а затем обратно) не меняет экран обратно на портретный.

Используя сообщения журнала, я определил, что послеНаходясь в ландшафтном режиме, классы Display и Configuration НЕ ОБНОВЛЯЮТ.Они по-прежнему содержат те же значения ориентации / длины / ширины, что и при работе устройства в альбомной ориентации.

Кто-нибудь знает, почему это так?

Дополнительный код (запрошен участником)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    disp = getWindowManager().getDefaultDisplay();
    swidth = disp.getWidth();
    sheight = disp.getHeight();
    int ornt;
    if(swidth == sheight)
        ornt = Configuration.ORIENTATION_SQUARE;
    else if(swidth < sheight)
        ornt = Configuration.ORIENTATION_PORTRAIT;
    else if(swidth > sheight)
        ornt = Configuration.ORIENTATION_LANDSCAPE;
    else
        ornt = Configuration.ORIENTATION_UNDEFINED;
    parent = new RelativeLayout(this);
    labelOne = new TextView(this);
    labelOne.setText("Temperature");
    labelOne.setId((int)(Math.random()*Integer.MAX_VALUE));
    temp = new EditText(this);
    temp.setSingleLine(true);
    temp.setBackgroundColor(Color.WHITE);
    temp.setTextColor(Color.BLACK);
    temp.setId((int)(Math.random()*Integer.MAX_VALUE));
    labelTwo = new TextView(this);
    labelTwo.setText("Humidity(%)");
    labelTwo.setId((int)(Math.random()*Integer.MAX_VALUE));
    humidity = new EditText(this);
    humidity.setSingleLine(true);
    humidity.setBackgroundColor(Color.WHITE);
    humidity.setTextColor(Color.BLACK);
    humidity.setId((int)(Math.random()*Integer.MAX_VALUE));
    output = new TextView(this);
    output.setBackgroundColor(Color.WHITE);
    output.setTextColor(Color.BLACK);
    output.setId((int)(Math.random()*Integer.MAX_VALUE));
    submit = new Button(this);
    submit.setText("Calculate");
    submit.setId((int)(Math.random()*Integer.MAX_VALUE));
    submit.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
              Double result = Calculate.calculate(getInputs());
              if(result !=null) {
                String answer = String.format("%,.1f",result);
                if(f.isChecked()) {
                    output.setText(answer + "°F");
                } else {
                    output.setText(answer + "°C");
                }
              }
        }
    });
    f = new RadioButton(this);
    f.setText("Fahrenheit");
    c = new RadioButton(this);
    c.setText("Celsius");
    rg = new RadioGroup(this);
    rg.setOnCheckedChangeListener(new ListenForMode());
    rg.addView(f);
    rg.addView(c);
    rg.setId((int)(Math.random()*Integer.MAX_VALUE));
    f.setChecked(true);
    if(ornt == Configuration.ORIENTATION_PORTRAIT || ornt == Configuration.ORIENTATION_SQUARE)
        layoutPortrait();
    else
        layoutLandscape();
}

Окончательное обновление

Проблема в том, что эмулятор неправильно реагирует на изменения ориентации.Я изменил проверку ориентации onConfigurationChanged (...), чтобы использовать условие width

Спасибо всем, кто написал этот вопрос!

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

Вы действительно не должны переопределять configChanges в вашем манифесте. Android может обрабатывать перерисовки для вас, и он действительно справляется с этим, особенно если вы отфильтровали макеты в папке ресурсов.

Если вы переопределяете configChanges из-за проблем, связанных с потерей AsyncTask своего контекста (как я когда-то это делал), я бы порекомендовал использовать IntentService для обработки асинхронной работы, поскольку службы не привязаны ни к одному действию.

0 голосов
/ 07 февраля 2012

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

Кажется, что эмулятор игнорирует атрибут android:configChanges="orientation", но немного странным образом: он вызывает изменение конфигурации, но не вызывает метод onConfigurationChanged(..) каждый раз, когда он должен быть вызван.

...