2017-12-19 34 views
2

Ich habe eine einzige Activity App, wo ich eine SearchView auf der Topbar gesetzt. Ich kämpfe, da es Tausende von Handbüchern/Tutorials zur Implementierung der Online-Suche gibt, aber alle scheinen irgendwie veraltet zu sein. Selbst die offizielle Dokumentation macht es mir nicht klar.SearchView mit Fragmenten

Aus irgendeinem Grund muss ich ein einzelnes Activity in meiner App verwenden und die gesamte Interaktion mit Fragment handhaben.

Ich kämpfe auf, wie man das SearchView Verhalten wie ich möchte: Ich will den Menüpunkt, um die Suchleiste an der Spitze, wenn ich klicken, dann bieten Geschichte und Vorschläge, dann, wenn etwas gesucht wird, zu öffnen eine andere Fragment mit den Ergebnissen (eigentlich eine TabLayout mit drei verschiedenen Ergebnisarten) - so denke ich Youtube.

Ich kam zu dem Punkt, wo die Suche nach etwas anderen Fragment auf den Bildschirm bringt, aber dann, dass ich will, wenn der Benutzer auf dem Zurück-Pfeil klickt, wird der Benutzer zurück zum vorherigen Fragment gebracht (ohne es wieder neu zu laden die Info - es gibt endloses Scrollen, so dass der Benutzer möglicherweise Tonnen von Daten geladen hat): Immer wenn ich klicke, verschwindet zuerst die Aktionsansicht für die Suche, wenn ich dann zurück drücke, wird der vorherige Fragment angezeigt, aber es lädt seinen Inhalt neu.

das ist mein setupSearch() Methode: (? Ich denke, weil es als dialog implementiert ist)

private fun setupSearch(menu: Menu) { 
     // Get the SearchView and set the searchable configuration 
     val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager 
     val searchItem = menu.findItem(R.id.app_search) 
     val searchView = searchItem.actionView as SearchView 
     // Assumes current activity is the searchable activity 
     searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName)) 


     var searchEditTextId = R.id.search_src_text; 
     var searchEditText = searchView.findViewById<AutoCompleteTextView>(searchEditTextId) 
     var dropDownAnchor = searchView.findViewById<View>(searchEditText.dropDownAnchor) 

     if (dropDownAnchor != null) { 
      dropDownAnchor.addOnLayoutChangeListener { p0, p1, p2, p3, p4, p5, p6, p7, p8 -> 
       // screen width 
       var screenWidthPixel = [email protected] 
       searchEditText.dropDownWidth = screenWidthPixel 
      } 
     } 

     searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { 
      override fun onQueryTextSubmit(query: String): Boolean { 
       var searchSuggestion = SearchRecentSuggestions([email protected], SearchHistoryProvider.AUTHORITY, SearchHistoryProvider.MODE) 
       searchSuggestion.saveRecentQuery(query, null) 

       supportFragmentManager 
         .beginTransaction() 
         .replace(R.id.fragment_container, SearchResultsContainerFragment.newInstance()) 
         .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) 
         .addToBackStack("SEARCH") 
       .commit() 
       return false 
      } 

      override fun onQueryTextChange(newText: String): Boolean { 
       return false 
      } 
     }) 

     searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener{ 
      override fun onMenuItemActionExpand(item: MenuItem): Boolean { 
       return true 
      } 

      override fun onMenuItemActionCollapse(item: MenuItem): Boolean { 
       return true 
      } 

     }) 

     searchView.setOnSuggestionListener(object: SearchView.OnSuggestionListener { 
      override fun onSuggestionSelect(position: Int): Boolean { 
       return false 
      } 

      override fun onSuggestionClick(position: Int): Boolean { 
       return false 
      } 

     }) 
    } 

Auch wenn die Vorschlagsliste angezeigt wird, scheint es die Activity irgendwie angehalten und wieder aufgenommen . Das wäre kein Problem, aber ich halte ein Videofenster immer oben auf allen Ansichten (daher muss ich alles mit Fragment machen) und das Video stoppt für eine Sekunde und geht dann weiter. Kann das verhindert werden?

Die Suche schien wie eine einfache Aufgabe, aber es wurde zu einem Albtraum. Die offizielle Dokumentation sagt, dass ich eine andere Activity erstellen muss, die "durchsuchbar" ist, aber ich kann das nicht tun.

+0

Das ist kein großes Problem. Sie müssen nur prüfen, welches Fragment gerade sichtbar ist, und diesen 'QueryText' in dieses Fragment senden und Ihre Liste dieses sichtbaren Fragments filtern. –

+0

scheint es mehrere Probleme zu geben, könnte die wichtigste isolieren? – Remario

Antwort

1

Wenn Sie das Fragment (das die Suche enthält) nicht neu laden möchten, wenn Sie zurückgehen, müssen Sie das Ersetzen-Fragment mit add ändern. Das liegt daran, dass replace ein Entfernen (eines beliebigen Fragments) gefolgt von einem Add (das neue Fragment) ausführt.

+0

In Ordnung, das behebt eines der Probleme, danke! – MichelReap

+0

@MichelReap, was ist der nächste? – azizbekian

+0

Ich habe ein Videofenster, das zu jeder Zeit angezeigt wird, wenn der Suchverlauf angezeigt wird, stoppt das Video aufgrund der Aktivität onPausing und onResuming – MichelReap