2009-12-15 6 views
3

J'ai une recherche de gestion d'activité (ACTIVITY_1), qui fonctionne parfaitement lorsque j'utilise la recherche (via le bouton SEARCH sur le téléphone) dans/depuis cette activité.Android: transmettre des requêtes de recherche à une seule activité qui gère la recherche

Cependant, quand j'utiliser la recherche d'une autre activité (ACTIVITY_2..x) en mettant en œuvre onNewIntent et en aval de la chaîne de requête à mon Search_Activity.class (ACTIVITY_1)

@Override 
protected void onNewIntent(Intent intent) { 
    Log.i(TAG, "onNewIntent()"); 

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     Log.i(TAG, "===== Intent: ACTION_SEARCH ====="); 
     Intent myIntent = new Intent(getBaseContext(), Search_Activity.class); 
     myIntent.setAction(Intent.ACTION_SEARCH); 
     myIntent.putExtra(SearchManager.QUERY, intent.getStringExtra(SearchManager.QUERY)); 
     startActivity(myIntent); 
    } 

} 

il interrompt toujours ACTIVITY_2 d'abord, puis passe à onCreate() de ACTIVITY_2.

  • Pourquoi est-il mon recréent ACTIVITY_2 quand il est déjà là et ne va pas onNewIntent directement?
  • Existe-t-il un autre moyen de transférer directement les requêtes de recherche vers ACTIVITY_1? Par exemple via un paramètre dans le fichier Manifest.xml
  • Est-il possible de transférer automatiquement toutes les requêtes de recherche automatiquement à ACTIVITY_1 sans même implémenter onNewIntent dans toutes les autres activités?

Actuellement, je dois mettre un <intent-filter> dans chaque activité à « activer » ma recherche personnalisée là-bas et transmettre la requête puis à l'activité qui gère la recherche via le onNewIntent (comme indiqué ci-dessus).

<activity android:name=".Another_Activity" 
    android:theme="@style/MyTheme"> 
    <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> 

Répondre

11

Je ne suis pas sûr de comprendre la chaîne d'événements votre décrivant, mais voici comment vous devez configurer votre application dans le cas étaient ACTIVITY_1 est l'activité de recherche que vous voulez toujours lancer de toutes vos autres activités lorsque l'utilisateur appuie sur le bouton "Recherche". En supposant que le bouton de recherche fonctionne parfaitement sur Activity1, il vous suffit d'ajouter un peu de métadonnées à votre application pour indiquer que toutes vos autres activités doivent utiliser ACTIVITY_1 pour la recherche, comme indiqué dans l'extrait de manifeste ci-dessous:

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

    <!-- All your activities, service, etc. --> 

</application> 

Avec cela, vous devriez être en mesure de supprimer les filtres-intention de tous, mais ACTIVITY_1, et vous aurez pas besoin d'utiliser le gestionnaire onNewIntent dans l'un de vos autres activités.

+0

Merci beaucoup Reto. Vous savez quoi? C'est l'une des choses que j'ai lues dans la documentation de SearchManager et je l'ai eu dès le premier jour où j'ai essayé d'implémenter la recherche. Cependant, au lieu de ma propre recherche, elle apparaissait toujours sur Google Web Search. Et j'ai finalement compris pourquoi: je viens d'avoir une faute de frappe stupide dans mon android: valeur = ". ACTIVITY_1", donc Android n'a jamais trouvé la bonne activité et donc directement à la recherche sur le web. Merci de m'avoir obligé à revoir cette paix du code. – znq

+0

par les docs, la balise meta-data va dans l'activité de la source, pas à l'application. –

Questions connexes