• 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。

  • 相关阅读:
    JQuery实现数组移除指定元素
    美团酒旅面经
    搜狗一面
    360面经
    头条面经
    搜狐笔试题
    kolakoski序列
    函数的节流
    隐藏元素的几种方法
    移动端适配与响应式布局
  • 原文地址:https://www.cnblogs.com/mada0/p/4835820.html
Copyright © 2020-2023  润新知