2013-10-24 10 views
11

ich die Suche Schnittstelle in andriod benutze und Folowing die Android-Anleitung, die ich die die Schnittstelle eingerichtet haben.Suche setQuery funktioniert nicht

Ich erstelle eine SearchableActivity, die sowohl die Benutzereingabe des Suchergebnisses behandelt.

Jetzt triff ich ein Problem, wenn Benutzer etwas in die SearchView Eingabe eingeben und den Suchschlüssel drücken, wird das Such-Request eingereicht, dann werde ich die Abfragezeichenfolge empfangen und die Suche durchführen, aber in diesem Moment den Text in den SearchView wurde auf den Standard SearchHit Wert geändert, während ich es der Abfrage-String sein soll.

Also habe ich versucht, die searchView.setQuery(query, false); zu verwenden, aber es funktioniert nicht, was ist das Problem?

Die Tätigkeitskodes Kern:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.map_activity_layout); 

    Log.d("map", "create"); 
    handleIntent(getIntent()); 
} 

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

private void handleIntent(Intent intent) { 
    Log.d("map", "handleIntent"); 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     String query = intent.getStringExtra(SearchManager.QUERY); 
     //try search 
     Log.d("map", "search and set query:" + query); 
     searchView.setQuery(query, false); // reset the value in of the SearchView 
    } 
} 

Die AndroidManifest.xml:

<activity 
     android:name=".ui.MapActivity" 
     android:launchMode="singleTop"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 
     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
    </activity> 
+0

haben Sie das Problem lösen. sogar ich habe an demselben Punkt geschlagen. –

Antwort

1

Es scheint, dass, wenn die Absicht mit Aktion Intent.ACTION_SEARCH empfangen wird, wird das folgende Verfahren genannt werden:

handleIntent(); 

onCreateOptionsMenu(); 

Und die handleIntent wird vor derlaufen.

Zur gleichen Zeit verwendeten die Menschen die searchView bei der onCreateOptionsMenu eingerichtet.

Das bedeutet, dass das Optionsmenü wieder aufgefüllt wird und die searchView wird neu erstellt, dann werden alle Einstellungen in handleIntent nicht funktionieren.

Ich denke, das ist der Grund.

Bitte zögern Sie nicht mich zu reparieren, wenn ich falsch liege.

11

Ich schlage vor, Sie die Einstellung bis zur nächsten Ereignisschleife zu verzögern (fügen Sie ihn in die Message Queue), so kann der Code sieht wie folgt aus:

private void handleIntent(Intent intent) { 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     final String query = intent.getStringExtra(SearchManager.QUERY); 
     searchView.post(new Runnable() { 

      @Override 
      public void run() { 
       // Important! Make sure searchView has been initialized 
       // and referenced to the correct (current) SearchView. 
       // Config changes (e.g. screen rotation) may make the 
       // variable value null. 
       searchView.setQuery(query, false); 
      } 
     }; 
    } 
} 
+3

einzige Antwort, die zuverlässig – Sourabh

11

Das funktioniert nicht

mSearchView.setQuery(mKeyword, true); 
    MenuItemCompat.expandActionView(mMenuSearch); 

Dies tut

MenuItemCompat.expandActionView(mMenuSearch); 
    mSearchView.setQuery(mKeyword, true); 

es scheint, es erinnert sich nur, wenn Sie die Aktion Ansicht erweitert. Ich verwende MenuItemCompat nur für die Abwärtskompatibilität

+2

arbeitete nicht für mich arbeiten, tat Verzögerung – Mene

+0

mSearchView.onActionViewExpanded(); mSearchView.setQuery ("", true); arbeitete für mich – Graeme

1

Bedarf mit MenuItemCompat Code in Post-Handler setzen

inflater.inflate(R.menu.menu_my_team, menu); 
    // search manager integration for search widget 
    SearchManager searchManager = (SearchManager) getActivity() 
      .getSystemService(Context.SEARCH_SERVICE); 
    final MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
    // MenuItem helpTutorialMenuItem = menu.findItem(R.id.action_help); 
    mSearchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); 

    mSearchView.setSearchableInfo(searchManager 
      .getSearchableInfo(getActivity().getComponentName())); 

    mSearchView.setQueryHint("Search by"); 

    if (!TextUtils.isEmpty(queryText)) { 
     mSearchView.post(new Runnable() { 
      @Override 
      public void run() { 
       MenuItemCompat.expandActionView(searchMenuItem); 
       mSearchView.setQuery(queryText, false); 
      } 
     }); 
    } 
    mSearchView.clearFocus(); 
+0

Dies sollte als Antwort markieren. – Max

+0

Sollte die 'MenuItemCompat.expandActionView (searchMenuItem);' aus dem Lauf ziehen und vor dem Post hinzufügen. Das hat immer für mich funktioniert, aber ich habe bemerkt, dass es sich nicht um ein Nougat-Gerät handelt, das ich getestet habe. –

+0

Arbeitete perfekt – Akshay

0

In meinem Fall war es funktioniert nicht, weil das Fragment ich in war nicht mehr angebracht war das Fenster. Bewegen sie oben, wo ich in der neuen Suchergebnisse Fragment es fest getauscht.

Verwandte Themen