У меня есть приложение, использующее ActionBar, где я сам обрабатываю изменения ориентации:
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
... и меню должно помещаться в ActionBar без переполнения в альбомной ориентации, но не в портретной:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="@string/Game" android:id="@+id/game" android:icon="@android:drawable/ic_menu_manage" android:showAsAction="ifRoom|withText"/>
<item android:title="@string/Type" android:id="@+id/type" android:icon="@android:drawable/ic_menu_edit" android:showAsAction="ifRoom|withText"/>
<item android:title="@string/Other" android:id="@+id/other" android:icon="@android:drawable/ic_menu_gallery" android:showAsAction="ifRoom|withText"/>
<item android:title="@string/Solve" android:id="@+id/solve" android:icon="@android:drawable/ic_menu_directions" android:showAsAction="ifRoom|withText"/>
<item android:title="@string/Help" android:id="@+id/help" android:icon="@android:drawable/ic_menu_help" android:showAsAction="ifRoom"/>
</menu>
При запуске это работает правильно:
Альбомная:
Портрет: (да, я мог бы заставить все элементы всегда отображаться, и они подходили бы, как показано ниже, но это может сломаться на планшете меньшего размера)
Когда эмулятор меняет ориентацию, емкость панели действий не меняется:
Портрет, когда я начал в альбомной ориентации: (это нормально, но непоследовательно)
Пейзаж, когда я начал в портретной ориентации: Это выглядит очень глупо, поэтому я хотите это исправить.
Я добавил этот вызов в invalidateOptionsMenu(), но он не помогает:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
maybeMoveSomeViewsAround(newConfig);
super.onConfigurationChanged(newConfig);
invalidateOptionsMenu();
}
(На самом деле я вызываю его отражением для обратной совместимости, но отладчик говорит мне, что он действительно вызывается и не сталкивается с исключением.)
invalidateOptionsMenu() на самом деле вызывает onCreateOptionsMenu() (который повторно наполняет меню) перед возвратом, и я вижу внутри последнего, что getResources().getConfiguration().ориентация уже изменилась. Так что это действительно озадачивает. Если меню параметров воссоздается, когда ориентация изменилась, это должен быть сам ActionBar, кэширующий ширину?
Есть ли способ воссоздать ActionBar без уничтожения/создания Activity? (поскольку последнее в моем случае немного дороже)
Изменить: вот минимальный пример проекта, показывающий проблему .
Редактировать 2: я подумал о проверке ширины экрана и программной настройке флагов showAsAction между всегда и никогда надлежащим образом, но для этого нужно знать (или угадывать) ширину каждого элемента. общедоступный API ActionBar не помогает мне в этом вопросе.