2017-12-19 21 views
2

私はSearchViewをトップバーに置いたActivityという単一のアプリケーションを持っています。オンラインで検索を実装するためのマニュアルやチュートリアルが何千もあるようなので、私は苦労していますが、それらのすべては何とか古くなっているようです。公式の文書でさえ私には明らかではありません。フラグメントのあるSearchView

私のアプリではActivityを1つ使用し、対話全体をFragmentで処理する必要があります。

SearchViewは、次のように動作するように苦労しています。メニューバーをクリックしてトップに表示し、ヒストリーや提案を提示してから、何か検索する異なるFragmentの結果(実際には、結果の種類が異なるTabLayout) - これはYoutubeの考え方です。

何かを検索すると画面に別のFragmentが表示されますが、ユーザーが戻る矢印をクリックすると、前回のFragmentに戻ることができます情報が無限にスクロールされているので、ユーザーが多数のデータを読み込んでいる可能性があります):をクリックすると、最初に検索のアクションビューが消えて、再びヒットすると、前のFragmentが表示されます。

これは私のsetupSearch()方法であって、(?それはdialogとして実装されているので、私は推測する)候補リストを表示する際に

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 
      } 

     }) 
    } 

また、Activityが何らかの形で一時停止し、再開されたようです。これは問題ではありませんが、私は常にすべてのビューの上にビデオウィンドウを保持しています(したがって、Fragmentですべてを行う必要があります)。それを防ぐことは可能ですか?

検索は簡単な仕事のように思えますが、その悪夢のようになりました。公式の文書によると、 "Searchable"という別のActivityを作成する必要がありますが、私はそれを行うことはできません。

+0

大きな問題はないこと。現在表示されているフラグメントを確認し、そのフラグメントにその 'QueryText'を送り、その可視フラグメントのリストをフィルタリングするだけです。 –

+0

複数の問題があるように見えますが、主要なものを分離できますか? – Remario

答えて

1

戻ったときにフラグメントをリロードしたくない場合(検索を含む)、追加で置換フラグメントを変更する必要があります。これは、replaceがremove(任意のフラグメントの)に続いてadd(新しいフラグメント)を実行するためです。

+0

申し訳ありませんが、これで問題の1つが修正されました。ありがとうございます! – MichelReap

+0

@MichelReap、次は何ですか? – azizbekian

+0

私はビデオのウィンドウを常に表示しています。検索履歴には、アクティビティのためにビデオが停止していることが表示されますonPAusing and onResuming – MichelReap

関連する問題