关于SearchView的一些小细节

1.ActionBar中不显示
2.默认图标修改
3.控件的监控
其中最耗时间的就是样式的问题了,后面会详细分析一下.

一.ActionBar中不显示
有两种情况:
1.menu的中xml文件中的设置问题:
        android:id="@+id/action_search"
        android:actionViewClass="android.widget.SearchView"
        android:icon="@drawable/ic_action_icon_search2"
        android:showAsAction="always"
        android:title="@string/search"/>
注意
这里需要注意android:showAsAction属性,它有五个属性值:
--------------
ifRoom,
collapseActionView,
withText,
never,
always,
--------------
这里如果你的Item不显示,不妨设置为always
然后在Activity的onPrepareOptionsMenu()方法中进行显示or隐藏的判断.
当然屏幕不够了还是会受收到overflow(三个小点)中的.
2.你在styles.xml文件中使用了自定义的ActionBar的style.
这里就需要你去判断你用了哪些属性了,这里就不深究了.
例如:
  
      
   

二.SearchView的获取和设置
这是重点,网上有很多资料,这里我就总结一些我看过后还是遇到的问题.
1.获取实例与初始化绑定事件
在Activity的onCreateOptionsMenu方法中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater(); //获取Menu的Inflater
        menuInflater.inflate(R.menu.main, menu); //inflate你的Item布局
        MenuItem action_search = menu.findItem(R.id.action_search); //获取MenuItem的实例,注意,这里获取的不是SearchView的实例.
        action_search.setVisible(false); //设置Item是否可见,这里与View的设置不太一样,接受的是boolean值,只有两种状态
    searchViewInit(menu);//自定义的一个初始化SearchView的方法
        return true;
}
/**
* SearchView的初始化
*/
private void searchViewInit(Menu menu) {
        //这里需要用到SearchView的布局文件[1],文章结尾有github的链接
        //用MenuItem的`getActionView()`方法获取`android:actionViewClass`说对应的实例,这里是`android.widget.SearchView`
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSubmitButtonEnabled(true);//是否显示确认搜索按钮
        searchView.setIconifiedByDefault(false);//设置展开后图标的样式,这里只有两种,一种图标在搜索框外,一种在搜索框内
        searchView.setIconified(false);//设置
        searchView.clearFocus();//清除焦点
        /*
        这里是重点,SearchView并没有提供样式的修改方法,所以只能
        1.用获取到的实例调用getContext()方法,返回当前view的上下文
        2.调用getResources()方法,获取该view的资源实例(Return a Resources instance)
        3.调用getIdentifier()方法,获取相同名字的ID,(Return a resource identifier for the given resource name)
        4.通过findViewById()获取该ID的实例,然后就可以做相应的操作了
        */
        int search_mag_icon_id = searchView.getContext().getResources().getIdentifier("android:id/search_mag_icon", null, null);
        ImageView  search_mag_icon = (ImageView)searchView.findViewById(search_mag_icon_id);//获取搜索图标
        search_mag_icon.setImageResource(R.drawable.ic_action_icon_search2);//图标都是用src的
        
        //设置提示文字的颜色,这里走了点奇招,用Html类方法
        searchView.setQueryHint(Html.fromHtml("" + getResources().getString(R.string.search_input) + ""));
        
        //设置搜索事件的监控
        searchView.setOnQueryTextListener(new OnQueryTextListener() {
               
                @Override
                public boolean onQueryTextSubmit(String query) {
                        //当点击搜索按钮,输入法搜索按钮,会触发这个方法.在这里做相应的搜索事件,query为用户输入的值
                        //当输入框为空或者""时,此方法没有被调用
                        return true;
                }
                @Override
                public boolean onQueryTextChange(String newText) {
                        //当输入的文字发生变化的时候,会触发这个方法.在这里做匹配提示的操作等
                        return true;
                }
        });
        //如果希望SearchView一直处理展开状态,可以实现它的OnCloseListener方法
        //返回true,截取关闭事件,不让搜索框收起来
        searchView.setOnCloseListener(new OnCloseListener() {
               
                @Override
                public boolean onClose() {
                        return true;
                }
        });
}
三.SearchView样式的修改
这是我最头疼的地方,我想修改item中的这个图标

在XML中设置icon并不能修改SearchView的搜索图标:
    android:id="@+id/action_search"
    android:actionViewClass="android.widget.SearchView"
    android:icon="@drawable/ic_action_icon_search2"
    android:showAsAction="always"
    android:title="@string/search"/>

你可能感兴趣的:(Android)