2013-06-26 12 views
9

Utknąłem w tej chwili przez chwilę. Przyjrzałem się innym odpowiedziom na SO, ale nie pomogły mi one rozwiązać mojego problemu.Okno dialogowe wyszukiwania nie jest wywoływane w obiekcieSearchRequested()

Mój problem polega na tym, że okno dialogowe wyszukiwania nie jest wywoływane przez onSearchRequested(). Nie jestem w stanie dowiedzieć się, co się dzieje z moim poszukiwaniu ...

Odpowiedni kod jest poniżej ...

Manifest

<activity 
    android:name=".SearchableActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.app.searchable" 
     android:resource="@xml/searchable" /> 
</activity> 

/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/search_hint" > 

</searchable> 

mam zasobów ciągów zdefiniowanych w strings.xml.

klasa SearchableActivity

public class SearchableActivity extends ListActivity { 

    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      Log.d("SEARCH", "HERE"); 
      handleIntent(getIntent()); 
     } 

     public void onNewIntent(Intent intent) { 
      setIntent(intent); 
      handleIntent(intent); 
     } 

     public void onListItemClick(ListView l, View v, int position, long id) { 
      // call the appropriate detail activity 
     } 

     private void handleIntent(Intent intent) { 
      if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
      String query = intent.getStringExtra(SearchManager.QUERY); 
      doSearch(query); 
      } 
     }  

     private void doSearch(String queryStr) { 
      Toast.makeText(getApplicationContext(), queryStr, Toast.LENGTH_LONG).show(); 
     } 

} 

Fragment kodu w działalności, która powołuje się na poszukiwania ...

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if(item.getTitle().equals("Search")) { 
     Toast.makeText(getApplicationContext(), "Search = "+onSearchRequested(), Toast.LENGTH_LONG).show(); 
     return onSearchRequested(); 
    } else { 
     return false; 
    } 
} 

onSearchRequested() wraca true. Ale SearchableActivity nie jest wywoływany. Każda pomoc jest doceniana.

Dziękuję bardzo.


AKTUALIZACJA

Nieważne! Rozgryzłem to!

Rozwiązaniem było przeniesienie meta-data poza znacznik activity i wewnątrz znacznika application. Zostały dodane poniżej jako odpowiedź dla tych, którzy napotkali ten problem.

Dzięki.

Odpowiedz

1

UPDATE

muszą Państwo overrideonNewIntent()

zmiana manifestu

<activity 
    android:name=".SearchableActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 
    <meta-data 
     android:name="android.app.default_searchable" 
     android:resource="@xml/searchable" 
     android:value=".SearchableActivity" /> 
</activity> 
+0

Dzięki. Próbowałem dodać 'android: value =" .Aktywność wyszukiwania' do 'meta-danych', ale nie pomogło. – neo108

+0

hej, spróbuj przesłonić onNewIntent() –

2

Got to działa.

Rozwiązaniem było przesunąć meta-data poza znacznikiem activity i wewnątrz znacznika application, jak poniżej ...

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

<activity 
    android:name=".SearchableActivity" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" > 
    <intent-filter> 
     <action android:name="android.intent.action.SEARCH" /> 
    </intent-filter> 

    <meta-data 
     android:name="android.app.searchable" 
     android:resource="@xml/searchable" /> 
</activity> 

Dzięki!

+3

Czy dziękowałeś sobie za odpowiedź na własne pytanie? – SK9

+2

To nie działało dla mnie ! –

+0

to zadziała, ale nie jest wymagane umieszczenie go poza tagiem aktywności Zobacz moją odpowiedź – Tomasz

3

Nie musisz przenosić metadanych poza tagiem aktywności, chyba że chcesz, aby każde działanie w aplikacji zapewniało okno dialogowe wyszukiwania.Prawdopodobnie nie zadziałało to dla ciebie, ponieważ wprowadziłeś meta-dane do niewłaściwej aktywności, a przeniesienie go na zewnątrz rozwiązało problem.

Nie myl ResearchActivity z działalności, która nazywa go tak:

<activity 
     android:name=".SearchableActivity" 
     android:label="@string/title_activity_searchable" 
     android:launchMode="singleTop"> 
     <meta-data 
      android:name="android.app.default_searchable" 
      android:value=".SearchableActivity" /> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 

daje żadnego błędu, ale nie działa. Przykładem pracy:

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/Theme.AppTheme"> 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.app.default_searchable" 
      android:value=".SearchableActivity" /> 
    </activity> 
    <activity 
     android:name=".SearchableActivity" 
     android:label="@string/title_activity_searchable" 
     android:launchMode="singleTop"> 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 
</application> 

MainActivity jest działalność, która dostarcza okna wyszukiwania (może to być również search widget) i SearchableActivity jest działalność rozpoczynając po użytkownik zażąda szukanie i onSearchRequested() jest wywoływany.

+0

Tomek podał właściwą odpowiedź Mam oddzielne działania związane z główną aktywnością i możliwą do przeszukiwania działalnością.Myślę, że główna aktywność wywoła przeszukiwalną aktywność. Android jest naprawdę mylący, jeśli chodzi o ** android.app.default_searchable ** i ** android.app.default_searchable ** o podobnym nazewnictwie, ale o innym znaczeniu, po prostu zmieszany z nowym programistą Androida. –

1

Musisz zadeklarować pełną ścieżkę do wg działalności

<meta-data 
      android:name="android.app.default_searchable" 
      android:value="com.example.search.SearchableActivity" /> 
+1

To rozwiązało mój problem –