SearchView的使用

介绍两种SearchView的使用方式:

1.在ActionBar上使用SearchView    2.在布局页面上使用SearchView

#在ActionBar上使用SearchView

1.在ActionBar的配置文件:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/search"
          android:title="@string/search"
          android:icon="@drawable/ic_menu_search"
          android:showAsAction="collapseActionView|ifRoom"
          android:actionViewClass="android.widget.SearchView" />
</menu>

2.重写onCreateOptionsMenu():

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        // 获取ActionBar上的SearchView
        // 这里需要用到SearchView的布局文件
        // 用MenuItem的getActionView()方法获取android:actionViewClass所对应的实例
        // 这里是android.widget.SearchView
        SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setSubmitButtonEnabled(true);// 是否显示确认搜索按钮
        // 设置展开后图标的样式,这里只有两种,一种图标在搜索框外,一种在搜索框内
        searchView.setIconifiedByDefault(false);
        searchView.setIconified(false);// 设置
        searchView.clearFocus();// 清除焦点
        /*
         * 这里是重点,SearchView并没有提供样式的修改方法,所以只能
         * 1.用获取到的实例调用getContext()方法,返回当前view的上下文
         * 2.调用getResources()方法,获取该view的资源实例(Return a Resources instance)
         * 3.调用getIdentifier()方法,获取相同名字的ID,(Return a resource identifier for the
         * given resource name) 4.通过findViewById()获取该ID的实例,然后就可以做相应的操作了
         */
        int search_mag_icon_id = searchView.getContext().getResources()
                .getIdentifier("android:id/search_mag_icon", null, null);
        ImageView search_mag_icon = (ImageView) searchView.findViewById(search_mag_icon_id);// 获取搜索图标
        search_mag_icon.setImageResource(R.drawable.ic_menu_search);// 图标都是用src的

        // 设置提示文字的颜色,这里走了点奇招,用Html类方法
        searchView.setQueryHint(Html.fromHtml("<font color = #FA646C>"
                + getResources().getString(R.string.search_hint) + "</font>"));

        searchView.setOnQueryTextListener(new OnQueryTextListener() {
            // 监听键盘点击确认按钮
            @Override
            public boolean onQueryTextSubmit(String query) {

                Toast.makeText(MainActivity.this, "submit text:" + query, Toast.LENGTH_SHORT).show();
                // 启动对应activity并将输入框文本传入
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_SEARCH);
                intent.setClass(MainActivity.this, SearchActivity.class);
                intent.putExtra(SearchManager.QUERY, query);
                startActivity(intent);
                return true;
            }

            // 监听输入框文本变化
            @Override
            public boolean onQueryTextChange(String newText) {

                Toast.makeText(MainActivity.this, "text change" + newText, Toast.LENGTH_SHORT).show();
                return true;
            }
        });
        // 如果希望SearchView一直处理展开状态,可以实现它的OnCloseListener方法
        // 返回true,截取关闭事件,不让搜索框收起来
        searchView.setOnCloseListener(new OnCloseListener() {

            @Override
            public boolean onClose() {
                return true;
            }
        });
        return true;
    }

3.新建SearchView响应Activity:

AndroidManifest.xml文件中的配置:

<activity android:name=".SearchActivity" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
        </activity>

4.搜索响应Activity:SearchActivity:

public class SearchActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handleIntent(getIntent());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        handleIntent(intent);
    }

    private void handleIntent(Intent intent) {

        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query = intent.getStringExtra(SearchManager.QUERY);
            // use the query to search your data somehow
            Toast.makeText(this, "search text is " + query, Toast.LENGTH_SHORT).show();
        }
    }
}

#在布局页面上使用SearchView:

1.Layout配置文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.actionbardemo2.SearchViewInLayoutActivity" >

    <SearchView
        android:id="@+id/search_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:iconifiedByDefault="true"
        android:imeOptions="actionSearch"
        android:inputType="textCapWords"
        android:queryHint="input text" />

</RelativeLayout>

2.Activity:

public class SearchViewInLayoutActivity extends Activity {
    SearchView sv = null;
    ListView lv = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_view_in_layout);
        sv = (SearchView) this.findViewById(R.id.search_view);

        sv.setIconifiedByDefault(false);

        sv.setSubmitButtonEnabled(true);

        sv.setQueryHint("查询");

        String[] columnNames = { "_id", "text" };
        MatrixCursor cursor = new MatrixCursor(columnNames);
        String[] array = { "cc", "ll", "hh" };
        String[] temp = new String[2];
        int id = 0;
        for (String item : array) {
            temp[0] = Integer.toString(id++);
            temp[1] = item;
            cursor.addRow(temp);
        }
        String[] from = { "text" };
        int[] to = { R.id.textView1 };
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(SearchViewInLayoutActivity.this,
                R.layout.search_view_suggestion_text, cursor, from, to,
                CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

        sv.setSuggestionsAdapter(adapter);

        sv.setOnQueryTextListener(new OnQueryTextListener() {

            @Override
            public boolean onQueryTextChange(String str) {
                Toast.makeText(SearchViewInLayoutActivity.this, str, Toast.LENGTH_SHORT).show();
                return true;
            }

            @Override
            public boolean onQueryTextSubmit(String str) {
                Toast.makeText(SearchViewInLayoutActivity.this, str, Toast.LENGTH_SHORT).show();
                return true;
            }

        });

    }

}

重用上例的响应activity。

原文地址:https://www.cnblogs.com/mada0/p/4835820.html