关于actionbar中searchview使用

来源:互联网 发布:电脑必学软件 编辑:程序博客网 时间:2024/06/09 09:50

1、最近写了个类似“今日头条”的软件,想实现actionbar搜索框searchview功能。
1)

public class FavoriteActivity extends ActionBarActivity {...}

当继承了ActionBarActivity
那么你的主题必须使用
类似ndroid:theme=”@style/Theme.AppCompat”低版本的兼容主题,不能使用高版本的主题,否则报错!!!

   <activity            android:name=".activity.FavoriteActivity"            android:theme="@style/Theme.AppCompat"    android:windowSoftInputMode="adjustPan|stateHidden"></activity>

使用
private android.support.v7.app.ActionBar mActionBar;
mActionBar = getSupportActionBar();

创建:

    @Override    public boolean onCreateOptionsMenu(Menu menu) {        MenuInflater inflater = getMenuInflater();        inflater.inflate(R.menu.menu, menu);        //        MenuItem searchItem = menu.findItem(R.id.search);        //    SearchManager searchManager = (SearchManager) this.getSystemService(this.SEARCH_SERVICE);        MenuItem hideMenu = menu.findItem(R.id.action_hide);        hideMenu.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {            @Override            public boolean onMenuItemClick(MenuItem item) {                mActionBar.hide();                return false;            }        });        SearchView searchView = (SearchView) searchItem.getActionView();        if (searchView == null) {            ToastUtils.showToast(this, "searchView is null");            return true;        }        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {            @Override            public boolean onQueryTextSubmit(String query) {                Log.d("FavoriteActivity", "query---" + query);                return true;            }            @Override            public boolean onQueryTextChange(String newText) {                if (TextUtils.isEmpty(newText)) {                    return true;                }                if (listBeforeQuery != null && listBeforeQuery.size() > 0) {                    if (pageNumber > 4) {                        Utils.resetList(more4list, listBeforeQuery);                    } else {                        Utils.resetList(less4list, listBeforeQuery);                    }                }                Log.d("FavoriteActivity", "newText---" + newText);                //oldNewsList = list;                keyList = DBUtils.getInstance(mContext).queryBykey(newText);                Log.d("FavoriteActivity", "236 keyList---" + keyList);                Log.d("FavoriteActivity", "237 list.size()---" + queryAllList.size());                Log.d("FavoriteActivity", "237 list---" + queryAllList);                Log.d("FavoriteActivity", "238 pageNumber---" + pageNumber);                if (pageNumber > 4) {                    Utils.resetList(listBeforeQuery, more4list);                    Log.d("FavoriteActivity", "221 listBeforeQuery---" + listBeforeQuery);                    //当前显示的列表中查询是否有包含关键字的 item                    // List list = Utils.getKeyValueList(more4list, keyList);                    Utils.resetListUpdate(more4list, keyList, newsAdapter);                    //newsAdapter.notifyDataSetChanged();                    //Utils.resetList( more4list,listBeforeQuery);                } else {                    Utils.resetList(listBeforeQuery, less4list);                    Log.d("FavoriteActivity", "226 listBeforeQuery---" + listBeforeQuery);                    //List list = Utils.getKeyValueList(less4list, keyList);                    Utils.resetListUpdate(less4list, keyList, newsAdapter);                    // Utils.resetList(less4list, listBeforeQuery);                }                return true;            }        });//        MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {            @Override            public boolean onMenuItemActionExpand(MenuItem item) {                Log.d("FavoriteActivity", "onMenuItemActionExpand");                favorite_listview.setMode(PullToRefreshBase.Mode.DISABLED);                return true;            }            @Override            public boolean onMenuItemActionCollapse(MenuItem item) {                favorite_listview.setMode(PullToRefreshBase.Mode.BOTH);                Log.d("FavoriteActivity", "onMenuItemActionCollapse");                Log.d("FavoriteActivity", "more4list---" + more4list);                Log.d("FavoriteActivity", "less4list---" + less4list);                Log.d("FavoriteActivity", "listBeforeQuery---" + listBeforeQuery);                //关闭搜索,还原到原来的列表数据                if (listBeforeQuery != null && listBeforeQuery.size() > 0) {                    Log.d("FavoriteActivity", "onMenuItemActionCollapse list.size()---" + queryAllList.size());                    Log.d("FavoriteActivity", "onMenuItemActionCollapse list---" + queryAllList);                    if (pageNumber > 4) {                        Utils.resetListUpdate(more4list, listBeforeQuery, newsAdapter);                        Log.d("FavoriteActivity", "270 more4list---" + more4list);                    } else {                        Utils.resetListUpdate(less4list, listBeforeQuery, newsAdapter);                        Log.d("FavoriteActivity", "274 less4list---" + less4list);                    }                }                return true;            }        });        return super.onCreateOptionsMenu(menu);    }

menu:

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto" >    <item        android:id="@+id/search"        app:actionViewClass="android.support.v7.widget.SearchView"        app:showAsAction="collapseActionView|ifRoom|withText"        android:icon="@android:drawable/ic_menu_search"        android:title="搜索..."/>    <item        android:id="@+id/action_share"        app:showAsAction="collapseActionView|ifRoom|withText"        android:icon="@android:drawable/ic_menu_share"        android:title="分享"/>    <item        android:id="@+id/action_hide"        app:showAsAction="never"        android:title="隐藏"/></menu>

search.xml

<?xml version="1.0" encoding="utf-8"?><android.support.v7.widget.SearchView xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/sv_searchview"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:iconifiedByDefault="false"    android:queryHint="search..." ></android.support.v7.widget.SearchView>

注:
主题
Theme.AppCompat.Light.DarkActionBar从命名看你可以知道,这是使用了AppCompat库里面的Theme资源,兼容安卓3.0以下: android:theme=”@style/Theme.AppCompat”

低版本不能使用高版本主题
android:theme=”@style/Theme.Holo”

这里出现问题,就是应用的其他界面是继承
extends Activity,使用了高版本的主题,而这个界面使用低版本的主题,差距很大,不美观和一致,应用太丑了!!!

搜索界面使用了低版本主题
主页使用holo主题

类extends ActionBarActivity 了
不能使用holo,会爆出

                                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lihui20.testhttp/com.example.lihui20.testhttp.activity.FavoriteActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

错误。

holo主题相关:
http://blog.csdn.net/xyz_lmn/article/details/12000941

Holo Theme在android 4.0版本以下怎么实现?
Holo Theme在4.0之上很容易实现,系统支持,如果在4.0之前的版本中使用Holo风格,则通过HoloEverywhere 库即可实现。HoloEverywhere 依赖 ActionBarSherlock来在4.0之前版本中实现ActionBar。
太麻烦了。。。

2)搜索界面直接继承Activity
actionbar 必须使用
mActionBar = getActionBar();
无法使用getSupportActionBar();获取!!!

修改如下:

 @Override    public boolean onCreateOptionsMenu(Menu menu) {        //        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu, menu);        // 获得menu中指定的菜单项        MenuItem searchItem = menu.findItem(R.id.search);        // 获得菜单项中的SearchView        SearchView searchView = (SearchView) searchItem.getActionView();        if (searchView != null) {            try {        //--拿到字节码                Class<?> searchViewClass = searchView.getClass();                //指定某个私有属性,mSearchPlate是搜索框父布局的名字                Field searchPlateField = searchViewClass.getDeclaredField("mSearchPlate");                //暴力反射,只有暴力反射才能拿到私有属性                searchPlateField.setAccessible(true);                View view = (View) searchPlateField.get(searchView);                //设置背景                view.setBackgroundColor(Color.TRANSPARENT);            } catch (Exception e) {                e.printStackTrace();            }        }        if (searchView == null) {            ToastUtils.showToast(this, "searchView is null");            return true;        }        // 当SearchView获得焦点时弹出软键盘的类型,就是设置输入类型        searchView.setInputType(EditorInfo.TYPE_CLASS_TEXT);        // 设置回车键表示查询操作        searchView.setImeOptions(EditorInfo.IME_ACTION_SEARCH);        // SearchView searchView = (SearchView) searchItem.getActionView();        searchView.setOnCloseListener(new SearchView.OnCloseListener() {            @Override            public boolean onClose() {                Log.d("FavoriteActivity", "355onClose");                Log.d("FavoriteActivity", "onMenuItemActionCollapse");                Log.d("FavoriteActivity", "more4list---" + more4list);                Log.d("FavoriteActivity", "less4list---" + less4list);                Log.d("FavoriteActivity", "listBeforeQuery---" + listBeforeQuery);                //关闭搜索,还原到原来的列表数据                if (listBeforeQuery != null && listBeforeQuery.size() > 0) {                    Log.d("FavoriteActivity", "onMenuItemActionCollapse list.size()---" + queryAllList.size());                    Log.d("FavoriteActivity", "onMenuItemActionCollapse list---" + queryAllList);                    if (pageNumber > 4) {                        Utils.resetListUpdate(more4list, listBeforeQuery, newsAdapter);                        Log.d("FavoriteActivity", "270 more4list---" + more4list);                    } else {                        Utils.resetListUpdate(less4list, listBeforeQuery, newsAdapter);                        Log.d("FavoriteActivity", "274 less4list---" + less4list);                    }                }                return false;            }        });        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {            @Override            public boolean onQueryTextSubmit(String query) {                Log.d("FavoriteActivity", "query---" + query);                return true;            }            @Override            public boolean onQueryTextChange(String newText) {                if (TextUtils.isEmpty(newText)) {                    return true;                }                if (listBeforeQuery != null && listBeforeQuery.size() > 0) {                    if (pageNumber > 4) {                        Utils.resetList(more4list, listBeforeQuery);                    } else {                        Utils.resetList(less4list, listBeforeQuery);                    }                }                Log.d("FavoriteActivity", "newText---" + newText);                //oldNewsList = list;                keyList = DBUtils.getInstance(mContext).queryBykey(newText);                Log.d("FavoriteActivity", "236 keyList---" + keyList);                Log.d("FavoriteActivity", "237 list.size()---" + queryAllList.size());                Log.d("FavoriteActivity", "237 list---" + queryAllList);                Log.d("FavoriteActivity", "238 pageNumber---" + pageNumber);                if (pageNumber > 4) {                    Utils.resetList(listBeforeQuery, more4list);                    Log.d("FavoriteActivity", "221 listBeforeQuery---" + listBeforeQuery);                    //当前显示的列表中查询是否有包含关键字的 item                    // List list = Utils.getKeyValueList(more4list, keyList);                    Utils.resetListUpdate(more4list, keyList, newsAdapter);                    //newsAdapter.notifyDataSetChanged();                    //Utils.resetList( more4list,listBeforeQuery);                } else {                    Utils.resetList(listBeforeQuery, less4list);                    Log.d("FavoriteActivity", "226 listBeforeQuery---" + listBeforeQuery);                    //List list = Utils.getKeyValueList(less4list, keyList);                    Utils.resetListUpdate(less4list, keyList, newsAdapter);                    // Utils.resetList(less4list, listBeforeQuery);                }                return true;            }        });        //hideMenu        MenuItem hideMenu = menu.findItem(R.id.action_hide);        hideMenu.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {            @Override            public boolean onMenuItemClick(MenuItem item) {                mActionBar.hide();                return false;            }        });        return true;    }

search.xml

<?xml version="1.0" encoding="utf-8"?><android.widget.SearchView xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/sv_searchview"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:iconifiedByDefault="false"    android:queryHint="search..." ></android.widget.SearchView>

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools">    <item        android:id="@+id/search"        android:actionViewClass="android.widget.SearchView"        android:orderInCategory="100"        android:showAsAction="ifRoom|withText"        android:title="搜索"/>    <item        android:id="@+id/action_hide"        android:showAsAction="never"        android:title="隐藏"/></menu>

其中
android:showAsAction=”ifRoom|withText”
必须这么写,不能设置never.否则点击无效无法弹开输入框!!!
android studio 红叉报错,不用管,编译正常。

好了,看一下效果,和主页一样:

这里写图片描述
这里写图片描述

1 0
原创粉丝点击