Android 官网Train阅读记录——7

来源:互联网 发布:蓝硕移动硬盘mac 编辑:程序博客网 时间:2024/06/05 09:15

LZ阅读的是中文翻译版本:http://hukai.me/android-training-course-in-chinese/basics/activity-lifecycle/recreating.html,试验机系统版本7.1。

10.4 增加搜索功能

10.4.1 建立搜索界面

从Android 3.0 开始,在ActionBar中使用SearchView作为Item,是在App中提供搜索的一种更好的方法。像其他所有ActionBar中的Item一样,你可以定义SearchView在有足够空间的时候总是显示,或设置为一个折叠操作,一开始SearchView作为一个图标显示,当用户点击图标时再显示搜索框占据整个ActionBar。


添加SearchView到ActionBar中

为了在ActionBar中添加SearchView,在工程目录res/menu/中创建一个名为menu_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/action_search_view"            android:title="@string/action_search"            android:icon="@android:drawable/ic_menu_search"            app:showAsAction="collapseActionView|ifRoom"            app:actionViewClass="android.support.v7.widget.SearchView"        /></menu>
这段代码定义了如何创建SearchView Item,比如使用的图标和Item的标题。collapseActionView属性允许你的SearchView占据整个ActionBar,在不适用的时候折叠成普通的ActionBar Item。由于在手持设备中ActionBar的空间有限,建议使用collapseActionView属性来提供更好的user experience。

另外注意上面代码中使用的是v7包中的SearchView,所以前面的属性名是app开头,注意。


要在ActionBar中显示SearchView,在你的Activity中复写onCreateOptionsMenu方法,并在其中填充菜单资源res/menu/menu_searchview.xml

 @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.menu_searchview, menu);        return true;}
现在运行App,SearchView会以一个放大镜图标的形式显示在ActionBar中,但是点击它没有效果。还需要定义SearchView如何运行。


创建一个搜索配置

在res/xml/目录下创建一个searchable.xml文件。在其中添加以下代码

<?xml version="1.0" encoding="utf-8"?><searchable xmlns:android="http://schemas.android.com/apk/res/android"        android:label="@string/app_name"            android:hint="@string/app_name"        />
在App的Manifest文件中,声明一个指向res/xml/searchable.xml文件的<meta-data>元素,来告诉你的App在哪里能找到搜索配置。在你想要显示SearchView的<activity>中声明<meta-data>元素

<activity android:name=".main.ui.SearchViewActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN"/>                <category android:name="android.intent.category.LAUNCHER"/>            </intent-filter>            <meta-data                    android:name="android.app.searchable"                    android:resource="@xml/searchable"/>        </activity>
在之前创建的onCreateOptionsMenu方法中调用SearchView的setSearchableInfo方法吧SearchView和搜索配置关联在一起

 @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.menu_searchview, menu);        SearchManager manager = (SearchManager) getSystemService(SEARCH_SERVICE);        MenuItem item = menu.findItem(R.id.action_search_view);        SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);        searchView.setSearchableInfo(manager.getSearchableInfo(getComponentName()));        return true;    }
调用getSearchableInfo放回一个SearchableInfo由搜索配置xml文件创建的对象。搜索配置与SearchView正确关联后,当用户提交一个搜索请求时,SearchView会以ACTION_SEARCH Intent启动一个Activity。所以现在需要在当前Activity添加能过滤这个Intent的intent-filter。

注意上面使用的是MenuItemCompat.getActionView这是为了使用v7包中的SearchView。


创建一个搜索Activity

<activity android:name=".main.ui.SearchViewActivity" android:launchMode="singleTop">            <intent-filter>                <action android:name="android.intent.action.MAIN"/>                <category android:name="android.intent.category.LAUNCHER"/>            </intent-filter>            <intent-filter>                <action android:name="android.intent.action.SEARCH" />            </intent-filter>            <meta-data                    android:name="android.app.searchable"                    android:resource="@xml/searchable"/>        </activity>
在搜索Activity中,通过在onCreate方法中检查ACTION_SEARCH Intent来处理它。

如果你的搜索Activity在single top mode下启动(android:launchMode="singleTop"),也要在onNewIntent方法中处理该Intent。在single top mode下你的Activity只有会被创建一次,而随后启动的Activity将不会在栈中创建新的Activity。这种启动模式很有用,因为用户可以在当前Activity中进行搜索,而不用在每次搜索时都创建一个新的Activity实例。

public class SearchViewActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_search_view);        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);            System.out.println(query);        }    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.menu_searchview, menu);        SearchManager manager = (SearchManager) getSystemService(SEARCH_SERVICE);        MenuItem item = menu.findItem(R.id.action_search_view);        SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);        searchView.setSearchableInfo(manager.getSearchableInfo(getComponentName()));        return true;    }}
现在运行App,在SearchView中键入信息后点击搜索,用户键入的信息就会被打印到Logcat上。

0 0
原创粉丝点击