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上。
- Android 官网Train阅读记录——7
- Android 官网Train阅读记录——1
- Android 官网Train阅读记录——2
- Android 官网Train阅读记录——3
- Android 官网Train阅读记录——4
- Android 官网Train阅读记录——5
- Android 官网Train阅读记录——6
- Android——api阅读记录
- Android官方文档阅读记录
- Android api阅读记录02
- Android API阅读记录03
- 阅读干货—HTTP记录与内容摘要
- Uva299——Train Swapping
- ML—决策树(train,matlab)
- Android学习记录—《第一行代码》阅读笔记(4)
- android 文档阅读记录-添加fragment
- Android Train随堂记
- train _cascade 源码阅读之HOG特征
- 反射使用注意事项
- Android进程间通信的几种方式
- Android使用OpenCV CamShift实现目标追踪
- Oracle 11g的网络配置
- TCP流量与拥塞控制 就是这么简单
- Android 官网Train阅读记录——7
- OpenCV学习笔记--视频读写
- 文件IO编程九
- 重新回到技术的轨道上来
- 转52破解jiangwei212Android爆破应用签名的一种全新高效方式(Native+服务器验证)
- Caffe学习系列(9):运行caffe自带的两个简单例子
- Java编程思想之面向对象
- 如何一个月熟悉TCP/IP协议族
- 腾讯云ubuntu centos配置jdk