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 90

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;
}

надеюсь, что это помогает

как обновленный ответ на ответ Пьера-Антуана Лафайета

ActionBarActivity не рекомендуется; используйте

((AppCompatActivity)getActivity()).getSupportActionBar();