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; }надеюсь, что это помогает