2016-03-29 1 views
1

Je suis en train de mettre en œuvre WhatsApp comme la recherche dans mes application.I doivent mettre en œuvre l'écran suivant:Activité interrogeable est pas appelé

ScreenShot

Comme vous pouvez le voir dans la capture d'écran, j'ai une icône de recherche en tant que menu d'option.

XML:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/action_search" 
     android:icon="@drawable/search" 
     android:orderInCategory="100" 
     android:title="@string/action_search" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     app:showAsAction="always|collapseActionView" /> 
</menu> 

En cliquant sur Recherche icône Afficher de recherche sera ouvert.

CODE:

public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater menuInflater = getMenuInflater(); 
    menuInflater.inflate(R.menu.menu_friend_list_activity, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.action_search: 
      Toast.makeText(getApplicationContext(), "Search button clicked", Toast.LENGTH_SHORT).show(); 

      // Associate searchable configuration with the SearchView 
      SearchManager searchManager = (SearchManager) FriendsListActivity.this.getSystemService(Context.SEARCH_SERVICE); 
      if (item != null) { 
       searchView = (SearchView) item.getActionView(); 
      } 
      if (searchView != null) { 
       searchView.setSearchableInfo(searchManager.getSearchableInfo(FriendsListActivity.this.getComponentName())); 
       searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
        @Override 
        public boolean onQueryTextSubmit(String query) { 
         Log.e("Query",query); 
         return false; 
        } 

        @Override 
        public boolean onQueryTextChange(String newText) { 
         return false; 
        } 
       }); 
      } 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 

} 

AndroidManifest.xml

<activity 
     android:name=".activity.FriendsListActivity" 
     android:parentActivityName=".activity.WelcomeActivity"> 
     <!-- To display the search view--> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 
    <activity android:name=".activity.SearchResultsActivity"> 
     <intent-filter> 
      <action 
       android:name="android.intent.action.SEARCH" 
       android:launchMode="singleTop" /> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
     </intent-filter> 
    </activity> 

Vous pouvez voir ici i ont une activité interrogeable nommée SearchResultsActivity. Je suis le tutoriel this.

SearchResultsACtivity:

public class SearchResultsActivity extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    Log.e("onCreate","in SerachActivity called"); 
    handleIntent(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    handleIntent(intent); 
} 

private void handleIntent(Intent intent) { 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     Log.e("Query1",query); 
     //use the query to search your data somehow 
     } 
    } 
} 

Je pense que je suis en train de faire quelque chose de mal here.When je suis en train de rechercher, SearchResultsActivity n'est pas appelé .Please me aider comment puis-je mettre en œuvre la recherche comme WhatsApp faire?

+0

Parce que vous ne démarrez jamais SearchResultsActivity? –

+0

vous pouvez également utiliser TextWatcher pour cela –

+0

@MuratK. : Selon la documentation "Une activité interrogeable est l'activité de votre application qui effectue des recherches basées sur une chaîne de requête et présente les résultats de la recherche Lorsque l'utilisateur exécute une recherche dans la boîte de dialogue ou le widget de recherche, le système démarre votre activité de recherche et lui fournit la requête de recherche dans un Intent avec l'action ACTION_SEARCH.Votre activité de recherche récupère la requête du QUERY supplémentaire de l'intention, puis recherche vos données et présente les résultats. " –

Répondre

0

Je suppose que vous lisez le didacticiel android here, cette page est très confuse si elle n'est pas complètement faux. Il y a deux endroits qui ont mal tourné dans votre code.

  1. Lorsque vous appelez searchView#setSearchableInfo, vous racontons Android ce que l'activité de lancer pour gérer résultat de la recherche, dans votre cas SearchResultsActivity. Donc, vous ne pouvez pas définir le nom du composant à FriendsListActivity, changer la place à SearchResultsActivity.searchView.setSearchableInfo(searchManager.getSearchableInfo(new ComponentName(this, SearchResultsActivity.class)))

  2. Pour une activité pour devenir consultable qui est en mesure d'être trouvé par searchManager, vous devez ajouter l'étiquette méta-données android.app.searchable au Bloc d'activité dans votre manifeste. Notez que cette étiquette ne doit pas être ajoutée à l'activité que vous affichez le SearchView, la page du didacticiel indique tout à fait faux. Alors changez votre SearchResultsActivity à ce qui suit.

Si vous avez fait ces deux changements, votre SearchView de FriendsListActivity serait correctement tient une instance mSearchable qui est en mesure de commencer SearchResultsAcitivity. Sinon, ce sera null.

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