2013-06-26 38 views
9

Sono stato bloccato su questo per un po 'di tempo. Ho visto altre risposte su SO ma non mi hanno aiutato a risolvere il mio problema.La finestra di dialogo di ricerca non viene chiamata onSearchRequested()

Il mio problema è che la finestra di ricerca non viene invocata da onSearchRequested(). Io non sono in grado di capire che cosa sta succedendo con la mia ricerca ...

Il codice in questione è la seguente ...

manifesto

<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> 

ho le risorse di tipo stringa definiti strings.xml.

classe 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(); 
     } 

} 

Il pezzo di codice nella attività che invoca la ricerca ...

@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() sta tornando true. Ma lo SearchableActivity non viene chiamato. Qualsiasi aiuto è apprezzato.

Grazie mille.


AGGIORNATO

Non importa! L'avevo capito!

La soluzione era spostare lo meta-data all'esterno del tag activity e all'interno del tag application. Ho aggiunto di seguito come risposta per coloro che si imbattono in questo problema.

Grazie.

risposta

1

UPDATE

è necessario overrideonNewIntent()

cambiamento manifesto a

<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

Grazie. Ho provato ad aggiungere 'android: value =". SearchableActivity' ai 'meta-dati' ma non ha aiutato. – neo108

+0

hey prova a scavalcare il onNewIntent() –

2

ottenuto che funziona.

La soluzione era quella di spostare il meta-data al di fuori del tag activity e all'interno del tag application, come qui di seguito ...

<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> 

Grazie!

+3

Ti sei ringraziato per aver risposto alla tua stessa domanda? – SK9

+2

Questo non ha funzionato per me ! –

+0

funzionerà ma non è necessario inserirlo all'esterno del tag attività Vedere la risposta – Tomasz

3

Non è necessario spostare i metadati al di fuori del tag di attività a meno che non si desideri che tutte le attività nell'applicazione forniscano la finestra di dialogo di ricerca.Il motivo per cui probabilmente non ha funzionato per te è perché hai messo i meta-dati in attività sbagliate e spostarli all'esterno ha risolto il problema.

Non confondere ResearchActivity con attività che chiama in questo modo:

<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> 

Dà nessun errore, ma non funziona. Esempio di lavoro:

<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 è l'attività che prevede finestra di ricerca (può essere anche search widget) e SearchableActivity è l'attività di partenza dopo che l'utente le richieste di ricerca e onSearchRequested() viene richiamato.

+0

Tomek ha dato la risposta corretta Ho attività separate dell'attività principale e attività di ricerca. Mi aspetto che l'attività principale possa chiamare l'attività di ricerca. Android è davvero confuso da avere ** android.app.default_searchable ** e ** android.app.default_searchable ** con un nome simile ma con un significato diverso. Ha appena confuso il nuovo programmatore Android. –

1

è necessario dichiarare percorso completo per attività Ricerca

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

Ha risolto il mio problema –

Problemi correlati