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 红叉报错,不用管,编译正常。
好了,看一下效果,和主页一样: