У меня есть приложение, использующее ActionBar, где я сам обрабатываю изменения ориентации:
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
... и меню должно помещаться в ActionBar без переполнения в альбомной ориентации, но не в портретной:
При запуске это работает правильно:
Альбомная:
Книжная: (да, я могу заставить все элементы всегда отображаться, и они подойдет, как показано ниже, но это может сломаться на меньшем планшете)
Когда эмулятор меняет ориентацию, емкость ActionBar, похоже, не меняется:
Портрет, когда я начинал в альбомной ориентации: {{1} } (это нормально, но непоследовательно)
Альбомная, когда я начинал в портретной ориентации: Это выглядит очень глупо, и это причина, по которой я хочу это исправить.
Я добавил этот вызов к invalidateOptionsMenu () , но он не помогает:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
maybeMoveSomeViewsAround(newConfig);
super.onConfigurationChanged(newConfig);
invalidateOptionsMenu();
}
(На самом деле я вызываю его отражением для обратной совместимости, но отладчик сообщает мне, что он действительно вызывается, и выполняет не возникает исключения.)
invalidateOptionsMenu () на самом деле вызывает onCreateOptionsMenu () (который повторно раздувает меню) перед возвратом, и я вижу внутри последнего, что ориентация getResources (). getConfiguration (). уже изменилась. . Так что это действительно озадачивает.Если меню параметров воссоздается, когда ориентация изменилась, это должен быть сам ActionBar, кэширующий ширину?
Есть ли способ воссоздать ActionBar без разрушения / создания Activity? (потому что последний в моем случае немного дороже)
Изменить: Вот минимальный пример проекта , показывающий проблему.
Редактировать 2: Я думал о проверке ширины экрана и программной настройке флагов showAsAction между всегда и никогда надлежащим образом, но для этого нужно знать (или угадывать) ширину каждого элемента. Открытый API ActionBar мне не помогает.