关于actionbar中searchview使用

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 红叉报错,不用管,编译正常。

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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值