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

Я видел несколько связанных вопросов по SO, но не могу решить свою проблему. Я создал отдельный макет для режима ПОРТРЕТ и ПЕЙЗАЖ.

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

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

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

Чтобы решить эту проблему, я создал класс GraphViewLand, который закодирован исключительно для режима ЛАНДШАФТ. Но он не звонит из 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");
    }
}

Любая помощь нужна :)


person GAMA    schedule 16.12.2011    source источник
comment
что это за файл .manifest? Вы имеете в виду AndroidManifest.xml?   -  person WarrenFaith    schedule 16.12.2011


Ответы (3)


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

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

person Sunil Kumar Sahoo    schedule 16.12.2011
comment
хорошо, мне нужно реализовать метод onConfigurationChanged()? - person GAMA; 16.12.2011
comment
Нет, вам это тоже не нужно, но поскольку действие уничтожено и создано, вам следует правильно сохранить и восстановить состояние приложения, чтобы вернуть контекст приложения пользователю. - person Vince; 16.12.2011
comment
С помощью Bundle: stackoverflow .com / questions / 151777 /, с onRetainNonConfigurationInstance (никогда не пробовал ...) developer.android.com/guide/topics/resources/ - person Vince; 16.12.2011
comment
Пример кода в упражнении 3 в блокноте tuto (не посвященном изменениям конфигурации): developer.android.com/resources/tutorials/notepad/ - person Vince; 16.12.2011
comment
@Vince, но 1-я ссылка из предыдущего комментария объясняет сохранение переменных, таких как boolean, String.etc, для извлечения. Я хочу получить состояние. - person GAMA; 16.12.2011
comment
Да, состояние вашего приложения - это сумма всех его данных в памяти, в конце это список переменных простого типа. Если в вашем коде есть классы, вы можете закодировать код сохранения и восстановления внутри каждого из них (т.е. система сериализации / десериализации) - person Vince; 16.12.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">
person Vince    schedule 16.12.2011
comment
Мое приложение всегда ориентировано как ландшафтное. Я переопределил метод отключения автоориентации. Раньше у меня был код в переопределенном onConfigurationChanged, но его больше нет. Я разместил это, потому что только с этим добавлением двух кодов он работал у меня. - person Vince; 16.12.2011
comment
Не может, приложение всегда запускается как ландшафт - person Vince; 16.12.2011
comment
Я также использую библиотеку под названием cocos2d-android, и я вызываю служебный метод для принудительного изменения ландшафта (для безопасности ...): github.com/ZhouWeikuan/cocos2d/blob/master/cocos2d-android/src/ theApp is Activity : developer.android.com/reference/android/app/ - person Vince; 16.12.2011
comment
Что вы имеете в виду: если я напишу android: screenOrientation = landscape в моем манифесте, а затем запущу приложение в портретном режиме, оно будет работать - person Vince; 16.12.2011
comment
Жесткое требование, о котором вы указали ранее, - это просто требование к оборудованию для рыночного фильтра. Я не могу вспомнить эмулятор, мне нужно было бы попробовать, но его здесь нет. Думаю, в эмуляторе все работает нормально. Я продолжаю искать. - person Vince; 16.12.2011

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

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

person curioustechizen    schedule 16.12.2011
comment
ага точно. Журнал не печатается, и я даже не получаю тост. Но если я не напишу код для добавления graphView в onCreate(), как мой graphView будет отображаться? Итак, я вызываю graphView в onCreate() и другой класс, т.е. graphViewLand в onConfigurationChanged(), но он не вызывается. - person GAMA; 16.12.2011
comment
Если вы даже не видите логи, то вторая часть моего ответа не имеет значения. Предлагаю вам взглянуть на ответ Сунила Кумара Саху на этот вопрос. Это более актуально для вашего случая. - person curioustechizen; 16.12.2011