getSupportActionBar изнутри фрагмента ActionBarCompat
Я начинаю новый проект, который использует 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? Это кажется плохим дизайном.
5 ответов
после фрагмент.onActivityCreated(...) у вас будет действительное действие, доступное через getActivity ().
вам нужно будет привести его к ActionBarActivity затем сделать вызов getSupportActionBar ().
((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);
вам нужен бросок. Это не плохой дизайн, это обратная совместимость.
хотя этот вопрос уже имеет принятый ответ, я должен отметить, что это не совсем правильно: вызов getSupportActionBar() С Fragment.onAttach() вызывает NullPointerException при вращении действия.
короткий ответ:
использовать ((ActionBarActivity)getActivity()).getSupportActionBar() на onActivityCreated() (или любой момент после этого в его жизненном цикле) вместо onAttach().
ответ:
причина в том, что если ActionBarActivity воссоздается после вращение, оно восстановит все фрагменты до создание
Если кто-то использует 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 класса? посмотрим!--14-->
внутри 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;
}
надеюсь, что это помогает
как обновленный ответ для ответа Пьера-Антуана Лафайета
ActionBarActivity устарел; использовать
((AppCompatActivity)getActivity()).getSupportActionBar();