2011-12-15 4 views
7

Je suis en train de mettre en œuvre une boîte de dialogue de recherche dans une application Android Mono par la documentation ici: http://developer.android.com/guide/topics/search/search-dialog.htmlRecherche Dialog dans Mono Android

J'ai une activité que l'utilisateur doit être en mesure de rechercher à partir de:

[Activity (Label = "MyActivity", MainLauncher = true, Icon = "@drawable/icon", Theme = "@style/MyStyle")] 
[MetaData ("android.app.default_searchable", Value = ".SearchActivity")] 
public class MainActivity : BaseActivity {... 

J'ai une activité interrogeable (où le levage lourd se produira):

[Activity(Theme = "@style/MyStyle", Label = "Searchable", LaunchMode = Android.Content.PM.LaunchMode.SingleTop)] 
[IntentFilter(new[] { Intent.ActionMain }, Categories = new[] { Intent.CategoryLauncher, Intent.ActionSearch })] 
[MetaData("searchable", Resource = "@xml/searchable")] 
public class SearchActivity : BaseActivity { ... 

Et j'ai mon searchable.xml:

<?xml version="1.0" encoding="utf-8"?> 
<searchable 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:label="MyLabel" 
    android:hint="Search Products"> 
</searchable> 

Lorsque j'appuie sur la touche de recherche du téléphone dans le MainActivity, rien ne se passe - pas de dialogue. Je pense que mon problème réside dans la façon dont les attributs sont traduits dans AndroidManifest.xml lors de l'exécution mais je ne suis pas sûr.

MISE À JOUR 1/3/2012: J'ai posté un projet distillé jusqu'aux éléments les plus fondamentaux ici. Appuyez sur le bouton de recherche sur votre Android et vous devriez voir le SearchDialog mais il n'apparaît pas: Demo Project Here

Répondre

4

Le problème est dans l'attribut [MetaData] sur MainActivity. Si vous fournissez la correctement la version de la classe des espaces de noms la boîte de dialogue de recherche apparaît correctement:

[MetaData ("android.app.default_searchable", Value = "searchdialogtest.SearchActivity")] 
public class MainActivity : BaseActivity { 
+0

Désolé j'ai attendu si longtemps pour accepter la réponse. Cette solution a fonctionné mais il manquait quelques informations. Tout d'abord, les Google Docs impliquent que le préfixe de votre nom d'activité avec un "." le qualifiera complètement, ce qui est apparemment faux. Deuxièmement, l'espace de noms doit être en minuscules. J'avais déjà essayé de qualifier complètement le nom de la classe, mais cela n'a pas fonctionné parce que mon espace de noms avait des caractères en majuscules. Je ne comprends pas pourquoi ce serait le cas. – dubj

+0

Java nécessite que les espaces de noms soient en minuscules, donc Mono pour Android traduit cela pour vous dans les coulisses. Dans ce cas, vous devez utiliser le nom de classe Java complet. Vous pouvez personnaliser l'espace de noms qui sera utilisé dans les propriétés du projet, et vous pouvez toujours vérifier le fichier AndroidManifest.xml généré lors du conditionnement dans le dossier obj/Debug/android pour voir ce qui est généré. –

+0

Je ne le savais pas sur les espaces de noms Java ou sur la façon de trouver le fichier manifeste généré. Celui que j'ai essayé de regarder (emballé dans l'apk) était en format binaire. C'était très utile, merci! – dubj

0

Je me sens dans le fichier manifeste, la balise méta-données searachable n'est pas correcte (android: name = "android.app.searchable «)

Manifest Exemple - MainActivity Tag -

<activity android:name=".MainActivity"> <meta-data android:name="android.app.default_searchable" android:value="pckname.SearchClass"/> </activity>

S tag earchActivity -

<activity android:name=".SearchActivity" > 
<intent-filter> 
    <action android:name="android.intent.action.SEARCH" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    <meta-data 
    android:name="android.app.searchable" 
    android:resource="@xml/searchable" /></activity> 
1

dans votre serachable.xml vous ne pouvez pas avoir une chaîne constante nom et le conseil ... ils devraient être liés dynamiquement @string/my_app_name@string/my_hint

et tout le travail va bien!