11

Próbuję uzyskać sugestie dla SearchView. Zaimplementowałem do tego niestandardowego dostawcę treści. Wspomniałem również o tym link, aby zaimplementować sugestie dla SearchView. Problem mam skierowane jest uzyskać wartość null na searchManager.getSearchableInfo(getComponentName())Android: getSearchableInfo (getComponentName()) zwracająca wartość null?

Oto fragmenty:

AndroidManifest.xml

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 

    <provider android:name=".SearchProvider" 
     android:enabled="true" 
     android:authorities="com.example.currentlocationmapdemo" 
     android:grantUriPermissions="true" 
     android:exported="true"> 
     <grant-uri-permission android:pathPattern="*" /> 
    </provider> 
    <uses-library android:name="com.google.android.maps" /> 

    <activity 
     android:name=".MainActivity" 
     android:label="@string/title_activity_main" > 
     <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> 

searchable.xml

<?xml version="1.0" encoding="utf-8"?> 
<searchable xmlns:android="http://schemas.android.com/apk/res/android" 
android:label="label" 
android:hint="hint" 
android:searchSuggestAuthority="com.example.currentlocationmapdemo" 
android:searchSuggestSelection=" ? "> 

główną działalność

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.searchview_in_menu, menu); 
    MenuItem searchItem = menu.findItem(R.id.action_search); 
    mSearchView = (SearchView) searchItem.getActionView(); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
SearchableInfo info = searchManager.getSearchableInfo(getComponentName()); // null returned 
mSearchView.setSearchableInfo(info); 

return true; 
} 

Odpowiedz

17

Przynajmniej jeden z twoich działań - z jednej Robisz poszukiwania od wystarcza - musi mieć ten intent-filtr w nim w manifeście:

<intent-filter> 
    <action android:name="android.intent.action.SEARCH" /> 
</intent-filter> 

Jeśli nie, to searchManager.getSearchableInfo(getComponentName()) zawsze zwraca null, a konfiguracja jest ignorowany.

To zabiło mnie na jeden dzień - myślałem, że to ActionBarSherlock, ale nie działa to dobrze. Problem polegał na tym, że próbowałem zwinąć próbkę, tak jak ty :-)

+1

Jako notatkę, obecnie mogę JĄ TYLKO zmusić do działania, jeśli filtr intencji jest w bieżącym działaniu. Jest to dość denerwujące, ponieważ chciałbym, aby przejść do innej aktywności, aby wyświetlić wyniki wyszukiwania. Jeśli wiesz o co chodzi, będę wdzięczny za wiadomość. – Erhannis

+0

Utracone godziny na tym. Brakowało filtra intencyjnego. –

8

Myślę, że podejście jest błędne. Powinieneś mieć 2 czynności - 1: Główna aktywność, która ma jako SearchView (w ActionBar lub układzie) i 2: SearchActivity, która zostanie uruchomiona podczas wyszukiwania.

Może ty też możesz to zrobić, ale nie jestem pewien. Gdzie chciałbyś wykorzystać zamiar ACTION_SEARCH w swoim podejściu? Normalnie to zrobić w onCreate w searchActivity tak:

Intent intent = getIntent(); 
if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
    String query = intent.getStringExtra(SearchManager.QUERY); 
    System.out.println("searching for: " + query); 
} 

Zrobiłem to na dwóch aktywnosci i pracował dla mnie. Jedna dodatkowa rzeczą miałem do zrobienia i nie mogę znaleźć w Android Search Tutorial został dodając:

<meta-data 
android:name="android.app.default_searchable" 
android:value=".SearchableActivity" /> 

w jawnym dla mojego główną działalność

+0

Moja implementacja była prawidłowa. Problem był bardzo głupi. Brakowało mi " " w pliku menu.xml. Jednak plik xml nie wyświetla żadnych błędów. – FireAndIce

+4

Atrybut "default_searchable" jest jedyną rzeczą, która NIE jest oficjalnie udokumentowana. Dziękuję Ci! Doprowadził mnie do szału. Dokumentacja na Androida to żart. – EinLama

1

Twój plik_wyszukiwalny.xml zawiera literały łańcuchowe (wskazówka i etykieta), powinny być referencjami. To właśnie powoduje, że nie działa zgodnie z tym: SearchInfo always coming out null