运行时改变菜单
系统调用onCreateOptionsMenu之后,一直保存这个实例,所以不会再调用出发菜单因为某些原因不可用,但是我们应该使用onCreateOptionsMenu仅仅初始化出菜单,在活动的整个生命周期不要改变。
如果非要变的话就在onPrepareOptionsMenu(),这个慎重吧。
Note: You should never change items in the options menu based on the View currently in focus. When in touch mode (when the user is not using a trackball or d-pad), views cannot take focus, so you should never use focus as the basis for modifying items in the
options menu. If you want to provide menu items that are context-sensitive to a View, use a Context Menu.
Using the contextual action mode
上下文动作模式是一个ActionMode是系统实现,针对用户交互,执行上下文动作。
ActingMode:代表用户界面的一个上下文模式。行为方式可以用来提供替代交互方式替换正常UI的部分,直到结束。行为模式好的方式例子包括文本选择和上下文行为。
当用户通过选择一个项目触发这个模式,一个上下文功能条出现在屏幕的顶部给用户呈现他们可以在当前选择可以执行的动作。当这个模式可用,用户可以选择多个选项(如果app允许),取消选择,并且在活动中导航。当用户取消选择所有的选项,点击返回按钮,或者选择功能条左边的完成,这个行为模式不可用,上下文菜单消失。
注意:上下文功能条不是必须和功能条关联。他们独自操作,即使上下文的功能条覆盖了功能条的位置。
如果在安卓3.0以上开发,应该使用上下文功能模式呈现上下文行为,而不是悬浮的上下文菜单。
对于提供上下文功能的view,通常应该调用下面当中一个或全部来激发上下文模式。
(1)用户长按
(2)用户选择一个checkbox或者类似的UI组件在view中
我们自己的程序如何调用这个上下文模式,有自己定义。有两种设计:
(1)在一个独立的,任意的view上
(2)在ListView或者GridView上的一组选项(允许用户多选,在他们上面执行同一个行为)。
Enabling the contextual action mode for individual views
如果想在用户选择特定的view的时候激活上下文行为模式,应该
(1)实现ActionMode.CallBack接口。在他的回调方法中,可以指定上下文功能条的行为,响应点击事件,处理其他的生命周期事件
(2)调用startActionMode当需要展示功能条的时候(比如用户长按view)
Enabling batch contextual actions in a ListView or GridView
如果想在ListView或者GridView(或者其他AbsListView的实现),允许用户执行多个动作应该:
(1)实现AbsListView.MultiChoiceModeListener 接口(就是创建他的一个实例,我们可以直接通过匿名函数的方式处理),通过setMultiChoiceModelListener设置到view group中。在监听器回调方法中,可以为上下文功能条指定行为,响应每个条目的单击事件,处理其他继承自ActionMode.call接口的回调
(2)调用setChoiceMode使用CHOICE_MODE_MULTIPLE_MODAL参数。
下面这个还需要继续学习哈:比如checkbox的?
That‘s it. Now when the user selects an item with a long-click, the system calls the onCreateActionMode() method and displays the contextual action bar with the specified actions. While the contextual action bar is visible, users can select additional items.
In some cases in which the contextual actions provide common action items, you might want to add a checkbox or a similar UI element that allows users to select items, because they might not discover the long-click behavior. When a user selects the checkbox,
you can invoke the contextual action mode by setting the respective list item to the checked state with setItemChecked().
1.Instantate a PopupMenu with its constructor, which takes the current application Context and the View to which the menu should be anchored.
2.Use MenuInflater to inflate your menu resource into the Menu object returned by PopupMenu.getMenu(). On API level 14 and above, you can use PopupMenu.inflate() instead.
3.Call PopupMenu.show().
To perform an action when the user selects a menu item, you must implement the PopupMenu.OnMenuItemClickListener interface and register it with your PopupMenu by calling setOnMenuItemclickListener(). When the user selects an item, the system calls the onMenuItemClick()
callback in your interface.