У меня есть приложение, использующее панель действий, где я самостоятельно обрабатываю изменения ориентации:
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>
При запуске это работает правильно:
Пейзаж:
Портрет:
(да, я могу заставить все элементы отображаться всегда, и они будут соответствовать, как показано ниже, но это может сломаться на меньшем планшете)
Когда эмулятор меняет ориентацию, емкость ActionBar не изменяется:
Портрет, когда я начинал в пейзаже:
(это нормально, но противоречиво)
Пейзаж, когда я начинал в портрете:
Это выглядит очень глупо и является причиной, по которой я хочу это исправить.
Я добавил этот вызов в invalidateOptionsMenu () , но это не помогает:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
maybeMoveSomeViewsAround(newConfig);
super.onConfigurationChanged(newConfig);
invalidateOptionsMenu();
}
(На самом деле я называю это отражением для обратной совместимости, но отладчик говорит мне, что он действительно вызывается и не встречает исключения.)
invalidateOptionsMenu () фактически завершает вызов onCreateOptionsMenu () (который заново раздувает меню) перед возвратом, и внутри последнего я вижу, что ориентация getResources (). GetConfiguration (). Уже изменилась. Так что это действительно загадочно. Если меню опций воссоздается, когда ориентация изменилась, это должен быть сам ActionBar, кэширующий ширину?
Есть ли способ воссоздать ActionBar, не разрушая и не создавая Activity? (потому что последнее в моем случае немного дороже)
Редактировать: Вот минимальный пример проекта , показывающий проблему.
Редактировать 2: Я думал о проверке ширины экрана и программной настройке флагов showAsAction между всегда и никогда соответствующим образом, но для этого необходимо знать (или угадывать) ширину каждого элемента. Открытый API ActionBar не помогает мне в этом.