谁能给一个快速的例子,说明如何根据在 fragment 中发生的事情更改 Activity 操作栏的内容?我的意图:
普通菜单项-> 在 fragment 中有所变化-> 菜单项更改为保存/放弃按钮。
我最初的冲动是在活动和片段中都设置广播接收器进行互相交流,但我不确定这是否正确。
谁能给一个快速的例子,说明如何根据在 fragment 中发生的事情更改 Activity 操作栏的内容?我的意图:
普通菜单项-> 在 fragment 中有所变化-> 菜单项更改为保存/放弃按钮。
我最初的冲动是在活动和片段中都设置广播接收器进行互相交流,但我不确定这是否正确。
片段可以更改操作栏中的菜单。为此,您需要在片段的 oncreate()
方法中使用 setHasOptionsMenu(true);
方法添加必要的标志。
当加载片段时,您将在 onCreateOptionsMenu(Menu menu, MenuInflater inflater)
中获得调用,就像在活动中一样。然后对菜单进行必要的更改。
将菜单保存为片段中的全局变量,并在需要进行更改时应用它。
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
实例的权限。
我认为你想使用上下文操作模式。在拖动事件中,您将启动一个新的ActionMode,可以用特定于您希望允许用户执行的操作的菜单项替换操作栏的内容。一旦用户选择了一个动作,您就完成了动作模式,并且操作栏将返回到其先前的状态。
我不确定一个ActionBar实例是否对你的菜单有帮助,但肯定会很有用。以下是一种获取方法:
尝试使用Fragment中的onAttach(Activity activity)方法从FragmentActivity获取ActionBar。
首先,在Fragment中创建一个全局的FragmentActivity对象,像这样:
public class YourFragment extends Fragment {
private YourFragmentActivity context;
}
@Override
public void onAttach(Activity activity){
context = (YourFragmentActivity)activity;
super.onAttach(activity);
}
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState){
...
android.support.v7.ActionBar actionBar = context.getSupportActionBar();
...
}
getActivity()
代替设置自己的 context
字段吗? - LarsH