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">