Я начинаю новый проект , который использует AppCompat/ActionBarCompat
в v7
библиотеке поддержки. Я пытаюсь понять, как использовать getSupportActionBar
из фрагмента. Моя активность, в которой размещен фрагмент, расширяется ActionBarActivity
, но я не вижу аналогичного класса поддержки для фрагментов.
Изнутри моего фрагмента
public class CrimeFragment extends Fragment {
//...
getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment
//...
}
На странице Google по его использованию ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html ) говорится, что для v4
фрагмента не должно быть изменений . Мне нужно переадресовывать все мои getActivity()
звонки на ActionBarActivity
? Это похоже на плохой дизайн.
Хотя на этот вопрос уже есть принятый ответ, я должен отметить, что он не совсем правильный: вызов
getSupportActionBar()
fromFragment.onAttach()
вызовет a,NullPointerException
когда действие будет повернуто.Короткий ответ:
Используйте
((ActionBarActivity)getActivity()).getSupportActionBar()
вonActivityCreated()
(или в любой другой точке его жизненного цикла) вместоonAttach()
.Длинный ответ:
Причина в том, что если
ActionBarActivity
воссоздать объект после поворота, он восстановит все фрагменты перед фактическим созданиемActionBar
объекта.Исходный код
ActionBarActivity
вsupport-v7
библиотеке:ActionBarActivityDelegate.createDelegate()
создаетmImpl
объект в зависимости от версии Android.super.onCreate()
isFragmentActivity.onCreate()
, который восстанавливает все предыдущие фрагменты после поворота (FragmentManagerImpl.dispatchCreate()
, & c).mImpl.onCreate(savedInstanceState)
isActionBarActivityDelegate.onCreate()
, который считываетmHasActionBar
переменную из стиля окна.mHasActionBar
правда,getSupportActionBar()
всегда будет возвращатьсяnull
.Источник для
ActionBarActivityDelegate.getSupportActionBar()
:источник
ActionBarActivity
устарела. ИспользуйтеAppCompatActivity
вместо этогоЕсли кто-то использует com.android.support:appcompat-v7: и AppCompatActivity в качестве активности, тогда это будет работать
источник
в вашем
fragment.xml
добавленииToolbar
тега из библиотеки поддержкиТеперь, как мы можем контролировать это из
MyFragment
класса? Посмотримвнутри
onCreateView
функции добавьте следующееи если вы хотите добавить
items
на панель инструментов внутриMyFragment
,must
добавьте эту строку внутриonCreateView
функцииэта строка важна, если вы ее забудете, Android не заполнит ваши пункты меню.
Предположим, мы идентифицируем их в
menu/fragment_menu.xml
после этого переопределите следующие функции
надеюсь это поможет
источник
Как обновленный ответ на ответ Пьера-Антуана Лафайета
ActionBarActivity устарел; использовать
AppCompatActivity
вместоисточник
Для тех, кто использует котлин,
источник