Android 的搜索有两种可用方式:
Search Dialog
它是一个 UI Component , 被激活的时候, 会在顶部显示一个浮动的搜索框。
SearchView
可以被布局到任何地方。在 Android 3.0 (Level 11) 中提供。
SearchView 简单,随意使用,这里主要说说 Search Dialog 的基本用法, 因为 Xamarin 的处理方式稍稍和 原生 Android 有些不同。
效果:
源码:
https://github.com/gruan01/Xamarin-Example/tree/master/Search
Searchable
要使用 Search Dialog 需要配置一个搜索配置文件 : 放到Resources/xml 目录下 。
如果xml 目录不存在,需要手动创建一个。
文件名随便, 一般取 searchable.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <searchable xmlns:android="http://schemas.android.com/apk/res/android" 3 android:label="@string/SearchLabel" 4 android:hint="@string/SearchPlaceHolder" 5 > 6 </searchable>
根节点 必须是 searchable 。
android:label 是必填项
android:hint 就是 html5 中的 placeholder
其它属选项请参考:
http://developer.android.com/guide/topics/search/searchable-config.html
?Activity 启用 Search Diaog 功能
要启用 Search Dialog , 还必须在 Activity 上开启搜索
在原生的 Android App 里可以直接修改 manifest 文件。
如下 :
1 <activity android:name="Search" > 2 <intent-filter> 3 <action android:name="android.intent.action.SEARCH" /> 4 </intent-filter> 5 <meta-data android:name="android.app.searchable" android:resource="@xml/searchable"/> 6 </activity> 7 8 <activity android:name=".MainActivity" > 9 <meta-data android:name="android.app.default_searchable" 10 android:value=".Search" /> 11 </activity>
android:resource="@xml/searchable" 即指上面的配置文件 (xml/searchable.xml)
黄色标注出来的,为固定字符串。
这一部分可以参考:
http://developer.android.com/guide/topics/search/search-dialog.html
在 Xamarin 下, manifest 文件即 properties 下面的 AndroidManifest.xml
该文件由 Xamarin 自行维护, 不推荐直接修改。
要开启 Activity 的搜索, 可以这样:
?1, 新建一个 SearchActivity
1 [MetaData("android.app.searchable", Resource = "@xml/searchable")] 2 [IntentFilter(new[] { Intent.ActionSearch })] 3 [Activity(Label = "SearchActivity", Name = "aA.SearchA")] // aA.SearchA , aA为包名, 必须为小写字母开头 4 public class SearchActivity : Activity { 5 protected override void OnCreate(Bundle bundle) { 6 base.OnCreate(bundle); 7 8 9 if (this.Intent.Action.Equals(Intent.ActionSearch)) { 10 var query = this.Intent.GetStringExtra(SearchManager.Query); 11 Toast.MakeText(this, query, ToastLength.Short); 12 } 13 } 14 }
2,在要使用 Search Dialog 的 Activity 上这样写:
1 [MetaData("android.app.default_searchable", Value = "aA.SearchA")] 2 [Activity(Label = "Search", MainLauncher = true, Icon = "@drawable/icon")] 3 public class MainActivity : Activity {
其中 SearchActivity 上的 Activity 必须指定 Name, 而且必须是 xxx.xxx.xxx 的结构,如果只写 xxx , 编译会报错:缺少 package 名称。
package 名称必须以小写字母开头, 否则打包的时会报错:
在需要使用 Search Dialog 的 Activity 上 (上面示例中的的 MainActivity)的 MetaData 中指定 Value 为 SearchActivity 的 Name (aA.SearchA)
费这个劲加这个 Name 是因为 :
http://developer.xamarin.com/guides/android/advanced_topics/working_with_androidmanifest.xml/
Activity Name
Beginning with Xamarin.Android 5.1, the type name of an activity is based on the MD5SUM of the assembly-qualified name of the type being exported. This allows the same fully-qualified name to be provided from two different assemblies and not get a packaging error. (Before Xamarin.Android 5.1, the default type name of the activity was created from the lowercased namespace and the class name.)
If you wish to override this default and explicitly specify the name of your activity, use the
Name
property:
在 Xamarin.Android 5.1 以后, activity 的名字?会被 MD5SUM 处理, 像这样:
<activity android:icon="@drawable/icon" android:label="Search" android:name="md54b7a0ef5c9d7075d66a4a3ca71919313.MainActivity">?
编译后, 可以查看 obj\Debug\android\AndroidManifest.xml 的最终结果。
如何获取输入搜索内容
要使用 Search Dialog 可见,需要在启用了 Search Dialog 的 Activity 上触发:onSearchRequested 方法。
1 private void Btn_Click(object sender, EventArgs e) { 2 this.OnSearchRequested(); 3 }
有些 Android 机, 会自带一个 搜索按钮, 点这个按钮,也是一样会调用这个 OnSearchRequested.
当用户执行搜索的时候,系统会创建一个 Intent 存储用户的查询。
在 SearchActivity 中,
1 if (this.Intent.Action.Equals(Intent.ActionSearch)) { 2 var query = this.Intent.GetStringExtra(SearchManager.Query); 3 Toast.MakeText(this, query, ToastLength.Short); 4 }
如果想传递额外的参数到 SearchActivity, 可以这样传递:
1 public override bool OnSearchRequested() { 2 var bundle = new Bundle(); 3 bundle.PutBoolean("Key1", true); 4 this.StartSearch(null, false, bundle, false); 5 return true; 6 }
获取额外参数可以这样:
1 var bundle = intent.GetBundleExtra(SearchManager.AppData); 2 if (bundle != null) { 3 var key1 = bundle.GetBoolean("Key1"); 4 var key2 = bundle.GetBoolean("Key2"); 5 }
-------------
OK, 完
谢谢围观