ActionBar(5)自定义操作项(Action item)

来源:互联网 发布:苏联156项工程 知乎 编辑:程序博客网 时间:2024/04/28 01:07

1.操作视窗

可以添加一个视图作为一个Action Item。这个视图被称作操作被称作操作视窗,通过在xml元素的android:actionLayout属性制定我们希望现实布局资源的ID(例如@layout/mysearchview)

操作视窗是作为操作项目按钮的替代品显示在操作栏中的一个可视构件。例如,如果你有一个用于搜索的可选菜单项,你可以用SearchView类来替代操作栏上的搜索按钮,如图7所示:

             

       图7. 折叠(上)和展开(下)的搜索视窗的操作栏

       要个菜单资源中的一个项目声明一个操作视窗,你既可以使用android:actionLayout属性也android:actionViewClass属性来分别指定一个布局资源或要使用的可视构件类。例如:

[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <item android:id="@+id/menu_search"  
  4.           android:title="@string/menu_search"  
  5.           android:icon="@drawable/ic_menu_search"  
  6.           android:showAsAction="ifRoom|collapseActionView"  
  7.           android:actionViewClass="android.widget.SearchView" />  
  8. </menu>  

        android:showAsAction属性也可包含“collapseActionView”属性值,这个值是可选的,并且声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。


2.操作视窗事件

       如果需要给操作视窗添加一些事件,那么就需要在onCreateOptionsMenu()回调执行期间做这件事。你能够通过调用带有菜单项ID的findItem()方法来获取菜单项,然后再调用getActionView()方操作视窗中的元素。例如,使用以下方法获取上例中的搜索视窗构件。

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. @Override  
  2. public boolean onCreateOptionsMenu(Menu menu) {  
  3.     getMenuInflater().inflate(R.menu.options, menu);  
  4.     SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();  
  5.     // Configure the search info and add any event listeners  
  6.     ...  
  7.     return super.onCreateOptionsMenu(menu);  
  8. }

3.处理可折叠的操作视窗

        操作视窗让你在不改变Activity或Fragment的情况下,就可以给用户提供快捷的访问和丰富的操作。但是,默认情况下让操作视窗可见可能不太合适。要保证操作栏的空间(尤其是在小屏幕设备上运行时),你能够把操作视窗折叠进一个操作项按钮中。当用户选择这个按钮时,操作视窗就在操作栏中显示。被折叠的时候,如果你定义了android:showAsAction=”ifRoom”属性,那么系统可能会把这个项目放到溢出菜单中,但是当用户选项了这个菜单项,它依然会显示在操作栏中。通过给android:showAsAction属性添加“collapseActionView”属性值,你能够让操作视窗可以折叠起来。

        因为在用户选择这个项目时,系统会展开这个操作视窗,所以你不必要在onOptionsItemSelected()回调方法中响应这个菜单项。在用户选择这个菜单项时,系统会依然调用onOptionsItemSelected()方法,但是除非你在方法中返回了true(指示你已经替代系统处理了这个事件),否则系统会始终展开这个操作视窗。

       当用户选择了操作栏中的“向上”图标或按下了回退按钮时,系统也会把操作视窗折叠起来。

如果需要,你能够在代码中通过在expandActionView()和collapseActionView()方法来展开或折叠操作视窗。

       注意:尽管把操作视窗折叠起来是可选的,但是,如果包含了SearchView对象,我们推荐你始终把这个视窗折叠起来,只有在需要的时候,由用户选择后才把它给展开。在提供了专用的“搜索”按钮的设备上也要小心了,如果用户按下了“搜索”按钮,那么也应该把这个搜索视窗给展开,简单的重写Activity的onKeyUp()回调方法,监听KEYCODE_SEARCH类型的按键事件,然后调用expandActionView()方法,就可以把操作视窗给展开。

如果你需要根据操作视窗的可见性来更新你的Activity,那么你可以定义一个OnActionExpandListener事件,并且用setOnActionExpandListener()方法来注册这个事件,然后就能够在操作视窗展开和折叠时接受这个回调方法了,如:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. @Override  
  2. public boolean onCreateOptionsMenu(Menu menu) {  
  3.     getMenuInflater().inflate(R.menu.options, menu);  
  4.     MenuItem menuItem = menu.findItem(R.id.actionItem);  
  5.     ...  
  6.   
  7.     menuItem.setOnActionExpandListener(new OnActionExpandListener() {  
  8.         @Override  
  9.         public boolean onMenuItemActionCollapse(MenuItem item) {  
  10.             // Do something when collapsed  
  11.             return true;  // Return true to collapse action view  
  12.         }  
  13.   
  14.         @Override  
  15.         public boolean onMenuItemActionExpand(MenuItem item) {  
  16.             // Do something when expanded  
  17.             return true;  // Return true to expand action view  
  18.         }  
  19.     });  
  20. }  

0 0