关于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,使用了高版本的主题,而这个界面使用低版本的主题,差距很大,不美观和一致,应用太丑了!!!
类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 红叉报错,不用管,编译正常。
好了,看一下效果,和主页一样:
- 关于actionbar中searchview使用
- Actionbar中searchview
- 向ActionBar中添加SearchView
- AppCompatActivity中使用SearchView
- 关于SearchView的使用理解
- 关于android SearchView的使用
- actionBar的点击事件处理与SearchView的使用
- ActionBar SearchView收缩事件
- actionBar之searchView
- android actionbar searchview搜索提示
- actionBar+SearchView实现搜索功能
- ActionBar SearchView空指针异常
- SearchView与隐藏显示actionbar
- android actionbar searchview搜索提示
- SearchView 使用
- SearchView使用
- android toolbar中searchView的使用
- android中SearchView的简单使用
- loadrunner场景虚拟IP设置
- 天秤男最真实的解析!!
- Android Apk重新打包
- Keyboard Row
- python tab.py
- 关于actionbar中searchview使用
- Oracle层次化查询
- Android应用性能优化之使用SparseArray替代HashMap
- s2-045漏洞分析
- 解决Installation failed with message failed to establish session
- SSM框架——使用MyBatis Generator自动创建代码
- Unity和ios进行相册的一些交互
- java WebSocket实现简单的聊天室(包括群发和点对点聊天)
- Gradient descent --梯度下降(to be continued)