2011-12-15 2 views
7

Я пытаюсь реализовать диалог поиска в приложении Mono для Android в документации здесь: http://developer.android.com/guide/topics/search/search-dialog.htmlПоиск Диалог в Mono Android

У меня есть действие, которое пользователь должен иметь возможность искать от:

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

у меня есть для поиска активности (где тяжелая атлетика будет происходить):

[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 { ... 

И у меня 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> 

Когда я нажимаю клавишу поиска по телефону в MainActivity, ничего не происходит - нет диалога. Я думаю, что моя проблема заключается в том, как атрибуты переводится в AndroidManifest.xml во время выполнения, но я не уверен.

ОБНОВЛЕНИЕ 1/3/2012: Я разместил проект, отобранный до самых основных элементов здесь. Нажмите кнопку поиска на вашем Android и вы увидите SearchDialog, но он не появится: Demo Project Here

ответ

4

Проблема в атрибуте [MetaData] на MainActivity. Если вы предоставите правильно пространства имён версия класса диалоговое окно поиска отображается правильно:

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

Извините, я так долго ждал, чтобы принять ответ. Это решение работало, но не хватало некоторой информации. Прежде всего, в Документах Google подразумевается, что префикс имени вашей деятельности с именем «.» будет полностью квалифицировать его, что, по-видимому, неверно. Во-вторых, пространство имен должно быть строчным. Я уже пробовал полностью квалифицировать имя класса, но это не сработало, потому что в моем пространстве имен были символы верхнего регистра. Я не понимаю, почему это так. – dubj

+0

Java требует, чтобы пространства имен были снижены, поэтому Mono for Android переводит это для вас за кулисами. В этом случае вам нужно было использовать полное имя класса Java. Вы можете настроить пространство имен, которое будет использоваться в свойствах проекта, и вы всегда можете проверить файл AndroidManifest.xml, сгенерированный во время упаковки, в папке obj/Debug/android, чтобы узнать, что создается. –

+0

Не знал, что о пространствах имен Java или о том, как найти сгенерированный файл манифеста. Тот, который я пытался посмотреть (упакованный в apk), был в двоичном формате. Это было очень полезно, спасибо! – dubj

0

Я чувствую в файле манифеста, то searachable тег мета-данных не является правильным (андроид: имя = "android.app.searchable «)

образец манифеста - MainActivity Tag -

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

S 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

в вашем serachable.xml вы не можете иметь постоянную строку в качестве имени и намек ... они должны быть связаны динамически @string/my_app_name@string/my_hint

и все работы в порядке!

Смежные вопросы