Intereting Posts
Android Fragment State Ошибки, управляющие жизненным циклом UnityPlayer в собственном приложении для Android Существует ли минимальный SDK для использования папок Mipmap для значков запуска? Android Studio – Robolectric: android.content.res.Resources $ NotFoundException: нет такой метки com.my.app:string/app_name Виджет ViewPager не работает с RecyclerView Как я могу отклонить навигационный ящик, чтобы использовать кнопку Back-home-icon? Как программно изменить цвет текста элемента меню ActionBar? Android – Как скопировать эмулятор другу для тестирования Android: ACTION_BATTERY_LOW не запускается в эмуляторе. Получатель, зарегистрированный в коде, не отображается Как я могу получить тот же неопределенный ProgressBar, что и ICS с двумя вращающимися кругами? Ошибка приложения при запуске в API API 10, но не на API 16 из-за ресурсов $ NotFoundException Раздвижные вкладки на панели инструментов с использованием дизайна материалов FragmentPagerAdapter не восстанавливает фрагменты при изменении ориентации Создание макета входа, как в приложении facebook для Android Уведомления пользователей – Как восстановить потерянное уведомление от GCM?

Изменение панели действий для наложения изнутри фрагмента

У меня есть фрагмент (фрагмент 1), который заменяется другим фрагментом (фрагмент 2). Фрагмент 1 помещается в стек. Я использую режим совместимости (не ActionBarSherlock).

Вот моя проблема. Я хочу, чтобы панель действий отображалась как оверлей в некоторых фрагментах, но не в других. В частности, когда показан фрагмент 2, я хочу, чтобы он появился в оверлее, а затем возвращался к нормальной панели действий после выхода фрагмента 2.

Фрагмент 1 имеет регулярную панель действий, которая всегда видна. Но, когда я заменяю фрагмент 1 фрагментом 2, мне нужно скрыть панель действий через 5 секунд. Если есть событие касания, панель действий отображается снова. Все это прекрасно работает, но Fragment 2 перерисовывается каждый раз, когда панель действий скрыта или раскрыта. Из-за этого я хочу, чтобы панель действий в Fragment 2 показывалась как оверлей.

Я знаю, что могу изменить наложение панели действий, но я не знаю, как это сделать программно изнутри фрагмента. Я НЕ хочу менять его для каждого фрагмента, просто фрагмент 2.

Идеи ?????

Solutions Collecting From Web of "Изменение панели действий для наложения изнутри фрагмента"

Возможно, это не тот ответ, на который вы надеялись.

Рассмотрим другой вопрос: можно ли изменить тему активности после setContentView(...) ? Вопрос задавался много раз, и общее решение заключается в том, чтобы воссоздать (вызов finish() и startActivity(getIntent()) ) и установить новую тему перед setContentView(...) .

Ваш вопрос является дополнением к этому – с дополнительной сложностью изменения темы из фрагмента. В любом случае, я не считаю упомянутое выше решение хорошим.

ActionBar является одним из первых компонентов, которые должны быть инициализированы при создании Activity. Я не думаю, что вы найдете способ как-то «обновить» его новыми атрибутами. См. Ниже, как метод requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY) имеет дело с вызовами post-setContentView (…):

 @Override public boolean requestFeature(int featureId) { if (mContentParent != null) { throw new AndroidRuntimeException("requestFeature() must be called before adding content"); } .... .... } 

Итак, если setContentView(...) уже вызван для Activity (это в вашем случае), будет выбрано исключение среды выполнения.

Возможно ли, что вы даже не требуете этой функции?

Начните с установки ActionBar в качестве наложения в вашей теме:

 <item name="android:windowActionBarOverlay">true</item> <!-- Support library attribute for compatibility --> <item name="windowActionBarOverlay">true</item> 

Вот моя проблема. Я хочу, чтобы панель действий отображалась как оверлей в некоторых фрагментах …

Хорошо. Мы уже предусмотрели это выше.

… но не в других.

Скажем, вы не хотите, чтобы ActionBar был наложенным слоем во фрагменте B. Затем в макете фрагмента B сделайте следующее:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="?android:attr/actionBarSize" > <<<-- ?attr/actionBarSize for compatibility .... .... </LinearLayout> 

Если верхний край установлен в размере ActionBar, фрагмент B выглядит так, как если бы он имел обычный ActionBar, а не наложенный. Другим способом добиться этого было бы иметь View с android:layout_height="?android:attr/actionBarSize" помещенный как первый ребенок в вышеприведенный макет.

По существу:

  • Ваш ActionBar будет наложением.
  • В фрагментах, где ActionBar будет автоматически скрываться, в макете фрагментов не будет никакого набора верхнего поля.
  • В фрагментах, где ActionBar не должен быть наложен, макет фрагментов будет иметь максимальную маржу, установленную в actionBarSize .

Заметка (благодаря Jelle ) :

Если ваш ActionBar полупрозрачен, лучше было бы использовать отступы вместо поля для последовательного просмотра.