不多说,上代码。
一、首先,写好布局,就是一个ToolBar,把主题设置为NoActionBar。纯熟个人习惯,用ActionBar也可以。
二、创建menu文件。其中有个item只是为了给searchView提供自定义的提交按钮的。
<?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/main_menu_item_search"
android:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@drawable/search_1"
android:title="搜索"
app:showAsAction="always" />
<item
android:id="@+id/main_menu_item_btn_search"
android:icon="@drawable/search_1"
android:title="搜索"
android:visible="false"
app:showAsAction="always" />
<item
android:id="@+id/main_menu_item_friend"
android:title="朋友" />
<item
android:id="@+id/main_menu_item_about"
android:title="关于" />
</menu>
三、Activity代码。
package com.devin.searchviewdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements
SearchView.OnQueryTextListener {
private static final String TAG = "SearchView";
private SearchView searchView;
private Toolbar mToolBar;
private Menu menu;
//SearchView中的编辑框,这个编辑框是个android.support.v7.widget.SearchView$SearchAutoComplete
private SearchView.SearchAutoComplete searchText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolBar = (Toolbar) findViewById(R.id.toolbar_top);
setSupportActionBar(mToolBar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_option_menu, menu);
//取到menu对象,一边在其他地方调用
this.menu = menu;
MenuItem item = menu.findItem(R.id.main_menu_item_search);//获得菜单对象
searchView = new SearchView(this);//添加搜索控件
item.setActionView(searchView);
//searchView.setIconified(false);//设置默认展开
//searchView.setQueryHint("搜索关键字");//设置搜索关键字提示
searchView.setOnQueryTextListener(this);//设置搜索监听
//因为我们添加了一个自定义的提交按钮,所以将默认的按钮设为无效
//searchView.setSubmitButtonEnabled(true);//设置提交按钮是否有效
//搜索栏关闭事件
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
Log.i(TAG, "关闭");
return false;
}
});
searchText = (SearchView.SearchAutoComplete) searchView.findViewById(R.id.search_src_text);
return true;
}
/**
* 点击提交
*
* @param query
* @return
*/
@Override
public boolean onQueryTextSubmit(String query) {
//有了自定义提交按钮就不用这里了
Log.i(TAG, "submit:" + query);
return false;
}
/**
* 文本变化
*
* @param newText
* @return
*/
@Override
public boolean onQueryTextChange(String newText) {
MenuItem btnItem = menu.findItem(R.id.main_menu_item_btn_search);
//监控文本变化,如果为空就隐藏自定义的按钮,否则就显示
if (newText.isEmpty()) {
btnItem.setVisible(false);
} else {
btnItem.setVisible(true);
}
return true;
}
/**
* 菜单项选择监听
*
* @param item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.main_menu_item_btn_search:
//自定义的搜索提交按钮
Toast.makeText(MainActivity.this, searchText.getText().toString(), Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
}
可以使用原生的提交按钮,是一个右方向的箭头,如果要用放大镜,就用自定义的。用文本变化监控其是否显示。点击时获取搜索框的文本。
还需要去研究自动完成的代码。