Android: изменение элементов меню ActionBar из фрагмента

Может ли кто-нибудь дать быстрый пример того, как изменить содержимое панели действий Activity на основе чего-то, что происходит во фрагменте? Мое намерение:

Нормальные пункты меню → Что-то в фрагменте перемещается → пункты меню меняются, чтобы сохранить/отменить кнопки.

Мой первый импульс заключается в настройке широковещательных приемников как в активности, так и в фрагменте для перекрестного разговора, но я не уверен, что это правильно.

Ответ 1

Фрагменты могут изменять меню в панели действий. Для этого вам нужно добавить необходимый флаг в фрагмент oncreate() с помощью метода setHasOptionsMenu(true);

Когда ваш фрагмент загружен, вы получите вызов в onCreateOptionsMenu(Menu menu, MenuInflater inflater) точно так же, как в действии. Затем сделайте необходимые изменения в своем меню.

Сохраните меню как глобальное по фрагменту, и всякий раз, когда вы хотите внести изменения, примените его.

Ответ 2

Следующие работы для меня. У меня есть пользовательский класс, который реализует ListView.MultiChoiceModeListener внутри фрагмента:

public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
    // Choose the correct Action Bar menu to display
    int menu = myCondition == true ? R.menu.my_default_menu : R.menu.my_menu_2;

    // Configure to use the desired menu
    mode.getMenu().clear();
    MenuInflater inflater = getActivity().getMenuInflater();
    inflater.inflate(menu);
}

Учитывая, как вы обнаруживаете, что "что-то в фрагменте перемещено", расширение ListView.MultiChoiceModeListener может не сработать для вас, но, надеюсь, это иллюстрирует, как изменить меню. Ключ должен получить доступ к экземпляру ActionMode.

Ответ 3

Я думаю, вы хотите использовать контекстный режим действия. В событии перетаскивания вы начнете новый ActionMode, который может заменить содержимое панели действий пунктами меню, специфичными для того, что вы хотите разрешить пользователю. Как только пользователь выберет действие, вы закончите действие, и панель действий вернется в прежнее состояние.

Ответ 4

Не уверен, что экземпляр ActionBar поможет вам в меню, но, безусловно, будет полезен. Здесь можно найти способ

Попробуйте это, чтобы получить ActionBar из FragmentActivity, используя метод onAttach (Activity activity) в Fragment.

Прежде всего сделайте глобальный объект вашего FragmentActivity во Фрагменте, подобном этому

public class YourFragment extends Fragment {

  private YourFragmentActivity context;
}

Переопределите это в классе YourFragment

@Override
public void onAttach(Activity activity){
    context = (YourFragmentActivity)activity;
    super.onAttach(activity);
}

Затем в методе OnCreate в YourFragment сделайте это

@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState){
    ...

    android.support.v7.ActionBar actionBar = context.getSupportActionBar();

    ...
}