2014-05-08 10 views
14

Dies ist, wie ich durch meinen App navigieren:Fragment Ersatz löst onQueryTextChange auf Suche

  • öffnet Fragment mit Liste
  • Filterliste durch einen Text in Suche eingegeben
  • Tippen Sie auf listitem (Liste Fragment ersetzt wird von Detail-Fragment)
  • Navigieren zurück (fragment Listen Fragment ersetzt wird)

Als ich NAVI Gatter von Liste zu Detailfragment, ich möchte den aktuellen Filter der Suchansicht in einer String-Variablen behalten. Ich speichere den Wert der Suchansicht, wenn onQueryTextChange ausgeführt wird. Das Problem: Ich kann den tatsächlichen Filterwert nicht speichern, da onQueryTextChange aufgerufen wird, wenn ich von Liste zu Detail navigiere, weil etwas den Text der Suchansicht gelöscht hat.

// ... 
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String s) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String s) { 
      searchReceived(s); 
      return true; 
     } 
    }); 
// ... 

public void searchReceived(String searchQuery) 
{ 
    this.stateHolder.searchQuery = searchQuery; 
    // more code... 
} 

Wenn ich die Filter wiederherstellen möge, wenn die Navigation zurück, es filtert nur mit einem leeren String, weil der falsche Wert in this.stateHolder.searchQuery gespeichert wurde.

Stack:

onQueryTextChange():139, EmployeeListFragment$1 {com.example.exampleapp.fragment} 
onTextChanged():1153, SearchView {android.widget} 
access$2000():92, SearchView {android.widget} 
onTextChanged():1638, SearchView$11 {android.widget} 
sendOnTextChanged():7408, TextView {android.widget} 
setText():3816, TextView {android.widget} 
setText():3671, TextView {android.widget} 
setText():80, EditText {android.widget} 
setText():3646, TextView {android.widget} 
setQuery():511, SearchView {android.widget} 
onActionViewCollapsed():1250, SearchView {android.widget} 
collapseItemActionView():1662, ActionBarView$ExpandedActionViewMenuPresenter {com.android.internal.widget} 
collapseItemActionView():1258, MenuBuilder {com.android.internal.view.menu} 
clear():521, MenuBuilder {com.android.internal.view.menu} 
doInvalidatePanelMenu():789, PhoneWindow {com.android.internal.policy.impl} 
run():221, PhoneWindow$1 {com.android.internal.policy.impl} 

Wie kann ich die Search verhindern, dass durch das System gelöscht werden, wenn die Navigation?

Danke.

+0

Haben Sie eine Lösung für dieses Problem gefunden? – starrystar

+0

@starystar Ich habe hier eine mögliche Problemumgehung gepostet: https://StackOverflow.com/Questions/23544382/fragment-replacement-triggers-onquerytextchange-on-searchview#23558681 – Tom

Antwort

0

Ich habe das Menüelement Attribut showAsAction von android:showAsAction="always|collapseActionView" zu android:showAsAction="always" geändert. Nun hat sich das Aussehen und Verhalten der Suchansicht etwas geändert, aber die searchQuery wird nicht gelöscht!

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
      android:id="@+id/actionSearch" 
      android:icon="@android:drawable/ic_menu_search" 
      android:actionViewClass="android.widget.SearchView" 
      android:showAsAction="always" 
      android:title="@android:string/search_go" 
    /> 
</menu> 
2

Ich sehe Sie nicht eine Lösung noch nicht gefunden haben, ich habe gleiche problemhere posted:

Ich fand, dass, wenn invalidateOptionsMenu genannt wird auch die Methode onQueryTextChange wird genannt, weil die Ansicht Start dispatchRestoreInstanceState mit dem vorherigen Wert, nachdem Sie die Suche zum Beispiel gelöscht haben. Rufen Sie invalidateOptionsMenu vielleicht an?

Vielleicht innenonQueryTextChange, können Sie einen boolean auf einigen aktuellen Status Ihrer Anwendungsobjekte überprüfen, um zu wissen, ob die Methode Inhalt ausgeführt werden soll. In meinem Fall verwende ich mDrawerLayout.isDrawerOpen(..), um die Suche zu erlauben.

Auch können Sie die SearchView.OnQueryTextListener auf jeder Klasse Sie auf einem Fragment oder auf dem Main Activity-Klasse verwenden, implementieren, irgendwo in der Klasse, die Sie eine boolean Modul Variable könnten, die Sie in onQueryTextChange.

+0

Ich habe meine Lösung gepostet, die Ihnen bei Ihrer Frage helfen kann. –

4

Nach 2 Tagen prüfen werden Googeln habe ich die Lösung, die dir definitiv hilft.

Ich habe nur cut and pasted Code onCreateOptionMenu()-onPrepareOptionMenu()

Ich weiß nicht, warum es passiert, ich glaube, Hörer von searchView nicht NULL durch die Art und Weise zu gehen Sie Ihren Code auf diese Weise ändern können.

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    getSherlockActivity().getSupportMenuInflater().inflate(R.menu.menu_all_order, menu); 

    searchView = (SearchView) menu.findItem(R.id.menu_all_order_search).getActionView(); 
    searchView.setInputType(InputType.TYPE_CLASS_NUMBER); 
    searchView.setQueryHint("Enter Order No"); 
    searchView.setOnQueryTextListener(this); 
} 

und entfernen:

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
} 

Thanks :)

+0

Ich habe es auf viele Arten versucht, aber 'onQueryTextChange' wird nicht in jedem Fragment meiner App aufgerufen. –

0

Dies ist meine Lösung:

@Override 
     public boolean onQueryTextChange(final String newText) { 

      if (searchTF.isIconified()) 
       return false; 

      // put the "real" onQueryTextChange actions here 


      return true; 


     } 
1

Das Problem ist ActionBar (und Subkomponenten) kollabiert werden, wenn die Fragment, das es hält, wird ersetzt. Wenn dies geschieht, wird die SearchView-Abfrage gelöscht, wie in onActionViewCollapsed zu sehen ist. Abhilfen sind:

Prevent

entfernen setShowAsAction(MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); von der Suche Schöpfung Code oder android:showAsAction="collapseActionView" aus seinem XML-Code kollabiert.

Dies wirkt wie/wann die enge/Voicesearch Tasten Ansicht beim Versuch angezeigt werden, es zum Einsturz

Es wäre auch möglich, durch zwingende Suche des onActionViewCollapsed() -Methode zu verhindern kollabiert nichts zu tun, sondern würde erreichen das Gleiche.

Suche ignorieren ändert sich, wenn entsprechende

Wenn das Fragment nicht gültig ist (ersetzt), dann Abfrage Änderungen ignorieren, die das Fragment sonst verursachen würde seine gespeicherte Abfrage Text oder Layout (Ändern des Layouts ein verursachen würde verändern Ausnahme, wenn das Fragment tatsächlich keinen View-Inhalt hat).

public boolean onQueryTextChange(String newText) { 
    if (!isVisible()) { 
     // The fragment was replaced so ignore 
     return true; 
    } 
    // Text was actually changed, perform search 
    return true; 
} 

Dies wäre die bessere Option, da es die Funktionalität der Suchansicht nicht beeinträchtigt.