onConfigurationChanged () не вызывается при изменении ориентации - PullRequest
2 голосов
/ 16 декабря 2011

Я видел некоторые связанные вопросы по SO, но я не могу решить свою проблему. Я создал отдельный макет для режима PORTRAIT и LANDSCAPE.

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

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

Так что он отлично работает в режиме ПОРТРЕТ, но GraphView не правильно размещается, когда я переключаюсь в режим ЛАНДШАФТ.

Чтобы решить эту проблему, я создал класс 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 ]

5 голосов
/ 16 декабря 2011

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

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

1 голос
/ 16 декабря 2011

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

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

1 голос
/ 16 декабря 2011

Вы кодировали 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">
...