ActionView,它能在ActionBar直接显示一个具体的视图,如搜索框,而不只是一个Button.具体效果如下
一般情况下,用户需要在ActionBar上点击一个Button然后再显示搜索的页面或者对话框。现在我们需要在页面显示的时候就直接显示这个搜索框,这样的用户体验更好。具体实现如下:
-
定制menu配置文件
<menuxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="name.lushuai.android.application.study.ui.actionbar.ActionViewActivity">
<item android:id="@+id/action_searchview"
android:icon="@android:drawable/ic_menu_search"
android:title="@string/action_search"
android:actionViewClass="android.widget.SearchView"
android:showAsAction="ifRoom|collapseActionView"/>
<item android:id="@+id/action_settings"
android:icon="@android:drawable/ic_menu_add"
android:title="@string/action_settings"
android:showAsAction="never"
/>
</menu>
注意属性android:actionViewClass这个用于你需要显示的View的类的全称,当然你也可以自己定制View
showAsAction 设置成ifRoom | collapseActionView表示,如果Actionbar上的空间不够的话,定制的View将变成一个Button,这个Button将会放进overflowmenu 中,用户点击这个Button,对应的视图会在ActionBar上显示。
对于Action View 的点击事件,我们不需要处理 onOptionsItemSelected()方法。ActionView 可以自己处理点击事件,但是如果在 onOptionsItemSelected() 中返回true 的话,ActionView的视图就无法展开。因为onOptionsItemSelected() 返回true 表示这个点击事件已经处理过了,ActionView 就没有机会区去处理了。
在onCreateOptionsMenu中我们需要进行如下 处理
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to theaction bar if it is present.
getMenuInflater().inflate(R.menu.action_view,menu);
MenuItem searchItem =menu.findItem(R.id.action_searchview);
//searchItem.expandActionView();
SearchView searchView = (SearchView)searchItem.getActionView();
searchItem.setOnActionExpandListener(newMenuItem.OnActionExpandListener() {
@Override
public booleanonMenuItemActionExpand(MenuItem item) {
Toast.makeText(ActionViewActivity.this,"expand",Toast.LENGTH_SHORT).show();
return true;
}
@Override
public booleanonMenuItemActionCollapse(MenuItem item) {
Toast.makeText(ActionViewActivity.this,"collapse",Toast.LENGTH_SHORT).show();
return true;
}
});
//searchView.
return true;
}
如果在onCreateOptionsMenu 中ActionView 没有展开,那么页面显示后,还是需要点击ActionView 对应的item ,ActionView才能展开,因此我们需要在这个方法中把ActionView展开,如 MenuItem.expandActionView(),这样页面启动显示后,ActionView在ActionBar 上展开。
如果Activity需要根据ActionView的展开/关闭进行更新,那么就定义MenuItem.OnActionExpandListener接口。