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();