onConfigurationChanged() не вызывается при изменении ориентации

Я видел некоторые связанные вопросы по SO, но я не смог решить свою проблему. Я создал отдельный макет для режима ПОРТРЕТ и ЛАНДШАФТ.

Я изменил AndroidManifest.xml файл для соответствующего изменения ориентации, но onConfigurationChanged() не работает, когда я внедряю это в деятельность.

Теперь проблема в layout.addView(graphView, lp); в onCreate(), Я написал абсолютное жестко закодированное значение в GraphView учебный класс.

Так что он отлично работает в режиме PORTRAIT, но graphView не правильно размещается, когда я переключаюсь в режим LANDSCAPE.

Чтобы решить это я создал GraphViewLand класс, который кодируется исключительно для режима LANDSCAPE. Но это не из-за onConfigurationChanged(),

Остальная часть макета идет отлично, так как я создал отдельный main.xml файл для каждой ориентации. Но с тех пор graphView создается программно, неправильно размещается.

Я что-то здесь не так делаю?

Я только что прочитал это отсюда:

Для любых типов изменений конфигурации, о которых вы говорите, что вы обрабатываете их, вместо перезапуска вы получите вызов метода onConfigurationChanged(Configuration) вашей текущей деятельности. Если изменение конфигурации включает в себя любое, которое вы не обрабатываете, однако, действие все равно будет перезапущено и onConfigurationChanged(Configuration) не будет вызываться.

метод onCreate()

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    init();

    RelativeLayout layout = (RelativeLayout) findViewById(R.id.MainLayout);

    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
    lp.addRule(RelativeLayout.ALIGN_TOP, btnindex.getId());

    GraphView graphView = new GraphView(this, values, "CurrentGraph",
                horlabels, verlabels);
    layout.addView(graphView, lp);
    }

метод onConfigurationChanged()

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

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();

Log.v("LAND", "SCPAE");
    }
}

Любая помощь ценится:)

3 ответа

Решение

Если вы создаете два разных типа представлений (для альбомной и портретной ориентации) в XML и вам приходится писать логику для разных типов представлений, тогда не используйте android:configChanges в манифесте.

Если у вас нет android:configChanges в манифесте, и у вас есть разные наборы макетов для ландшафта и портрета, тогда при изменении ориентации ваш элемент управления переходит к onCreate() внутри этого метода, вы можете написать свою логику.

Как вы говорите, что onConfigurationChanged() метод не вызывается? Журнал не печатается? Тост не показывается?

Во-вторых, вы упоминаете, что проблема в layout.addView в onCreate(), Обратите внимание, что если android:configChanges присутствует в вашем манифесте, то onCreate() не вызывается при смене ориентации. Вам нужно переместить фрагмент кода, который программно изменяет макет пользовательского интерфейса, в onConfigurationChanged() метод.

Вы кодировали onConfigurationChanged как переопределение в своем классе Activity? Базовое переопределение:

// Called on rotation. 
    // Does not call onDestroy anymore due to android:configChanges="keyboardHidden|orientation" in manifest
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
    }

Моя декларация манифеста для информации:

<activity android:name=".Slime"
                  android:label="@string/app_name"
                  android:configChanges="keyboardHidden|orientation"
                  android:screenOrientation="landscape">
Другие вопросы по тегам