getSupportActionBar изнутри фрагмента ActionBarCompat
Я начинаю новый проект, который использует AppCompat/ActionBarCompat
in 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
? Это похоже на плохой дизайн.
5 ответов:
после фрагмент.onActivityCreated(...) у вас будет действительная активность, доступная через getActivity().
вам нужно будет привести его к ActionBarActivity затем сделать вызов getSupportActionBar ().
((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);
вам нужен актерский состав. Это не плохой дизайн, это обратная совместимость.
хотя этот вопрос уже имеет принятый ответ, я должен отметить, что это не совсем правильно: вызов
getSupportActionBar()
СFragment.onAttach()
вызываетNullPointerException
при повороте активности.короткий ответ:
использовать
((ActionBarActivity)getActivity()).getSupportActionBar()
наonActivityCreated()
(или любой момент после этого в его жизненном цикле) вместоonAttach()
.ответ:
причина в том, что если
ActionBarActivity
воссоздается после a вращение, он восстановит все фрагменты до создание
Если кто-то использует com.андроид.поддержка: appcompat-v7: и AppCompatActivity как активность, то это будет работать
((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);
в своем
fragment.xml
добавитьToolbar
тег из библиотеки поддержки<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
теперь, как мы можем управлять им с
MyFragment
класса? давайте посмотримвнутри
onCreateView
функция добавить следующееmToolbar = (Toolbar) view.findViewById(R.id.toolbar); ((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar); //add this line if you want to provide Up Navigation but don't forget to to //identify parent activity in manifest file ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
и если вы хотите добавить
items
на панели инструментовMyFragment
тыmust
добавьте следующую строку внутриonCreateView
функцииsetHasOptionsMenu(true);
эта строка важна, если вы ее забудете, android не будет заполнять ваши пункты меню.
предположим, мы идентифицируем их в
menu/fragment_menu.xml
после этого переопределите следующие функции
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_menu, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.action_1: // do stuff return true; case R.id.action_2: // do more stuff return true; } return false; }
надеюсь, что это помогает