Android:从Fragment更改ActionBar菜单项

16

谁能给一个快速的例子,说明如何根据在 fragment 中发生的事情更改 Activity 操作栏的内容?我的意图:

普通菜单项-> 在 fragment 中有所变化-> 菜单项更改为保存/放弃按钮。

我最初的冲动是在活动和片段中都设置广播接收器进行互相交流,但我不确定这是否正确。

4个回答

23

片段可以更改操作栏中的菜单。为此,您需要在片段的 oncreate() 方法中使用 setHasOptionsMenu(true); 方法添加必要的标志。

当加载片段时,您将在 onCreateOptionsMenu(Menu menu, MenuInflater inflater) 中获得调用,就像在活动中一样。然后对菜单进行必要的更改。

将菜单保存为片段中的全局变量,并在需要进行更改时应用它。


你能澄清一下“在片段中将菜单保存为全局”,以及“每当你想要进行更改时,应用它”吗? - LarsH

7
以下内容适用于我。我有一个自定义类,在片段内实现了 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实例的权限。


你可以在哪里获取Activity的ActionMode实例? - Neilers

4

我认为你想使用上下文操作模式。在拖动事件中,您将启动一个新的ActionMode,可以用特定于您希望允许用户执行的操作的菜单项替换操作栏的内容。一旦用户选择了一个动作,您就完成了动作模式,并且操作栏将返回到其先前的状态。


1

我不确定一个ActionBar实例是否对你的菜单有帮助,但肯定会很有用。以下是一种获取方法:

尝试使用Fragment中的onAttach(Activity activity)方法从FragmentActivity获取ActionBar。

首先,在Fragment中创建一个全局的FragmentActivity对象,像这样:

public class YourFragment extends Fragment {

  private YourFragmentActivity context;
}

在YourFragment类中覆盖此方法。
@Override
public void onAttach(Activity activity){
    context = (YourFragmentActivity)activity;
    super.onAttach(activity);
}

在 YourFragment 的 OnCreate 方法中这样做。
@Override
public View onCreateView(LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState){
    ...

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

    ...
}

你不能使用 getActivity() 代替设置自己的 context 字段吗? - LarsH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接