参考のため
これは問題を示すブランチです (プロジェクトが不完全であることに注意してください)。実行すると、コンパイル時エラーが表示されますUnresolved reference: search_src_text
。
私がやろうとしていること:
SearchView から ViewModel にテキストを送信したいと考えています。テキストが送信されると、そのテキストを使用してクエリを実行します。
あなたが考えているかもしれないこと:
「ただ使って
OnQueryTextListener
ください。」
テキストが null/空のOnQueryTextListener
場合、 はテキストを送信しません。null/空のケースを使用して、データベース内のすべてを検索しています。だからうまくいかない。
私が試した回避策:
過去にSearchAutoComplete
、SearchView 内のビューの ID を手動で検索しました。次のように見つけることができます。
val searchPlate: SearchView.SearchAutoComplete? = search_view.findViewById(R.id.search_src_text)
次に、 を添付OnEditorActionListener
して IME アクションをリッスンするだけで、準備完了です。
searchPlate.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED
|| actionId == EditorInfo.IME_ACTION_SEARCH ) {
val searchQuery = v.text.toString()
viewModel.setQuery(searchQuery)
viewmodel.executeSearch()
}
true
}
通常、これで問題なく動作します。(私が見ることができる) 唯一の違いは、今回はDynamic Feature Moduleを使用していることです。アクセスしようとすると、R.id.search_src_text
次のコンパイル時エラーがスローされます。
Unresolved reference: search_src_text
はい、レイアウトは動的機能モジュールの /res/ ディレクトリにあります。
コード
1. レイアウト内の SearchView
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/app_background_color"
>
<androidx.appcompat.widget.SearchView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:iconifiedByDefault="false"
android:queryHint="@string/text_Search"
android:layout_centerHorizontal="true" />
</androidx.constraintlayout.widget.ConstraintLayout>
2. search_src_text への参照を取得する
val searchPlate: SearchView.SearchAutoComplete? = search_view.findViewById(R.id.search_src_text)
プロジェクトを実行すると、エラーが発生しますUnresolved reference: search_src_text
。
別の奇妙なこと:
SearchAutoComplete が見つかるまでビュー階層をループしてから、リスナーをアタッチすると、問題なく動作します...
for((index1, child) in search_view.children.withIndex()){
printLogD("ListFragment", "${index1}, ${child}")
for((index2, child2) in (child as ViewGroup).children.withIndex()){
printLogD("ListFragment", "T2: ${index2}, ${child2}")
if(child2 is ViewGroup){
for((index3, child3) in (child2 as ViewGroup).children.withIndex()){
printLogD("ListFragment", "T3: ${index3}, ${child3}")
if(child3 is ViewGroup){
for((index4, child4) in (child3 as ViewGroup).children.withIndex()){
printLogD("ListFragment", "T4: ${index4}, ${child4}")
if(child4 is SearchView.SearchAutoComplete){
child4.setOnEditorActionListener { v, actionId, event ->
if (actionId == EditorInfo.IME_ACTION_UNSPECIFIED
|| actionId == EditorInfo.IME_ACTION_SEARCH ) {
val searchQuery = v.text.toString()
printLogD("NoteList", "SearchView: (keyboard or arrow) executing search...: ${searchQuery}")
viewModel.setQuery(searchQuery).let{
viewModel.loadFirstPage()
}
}
true
}
break
}
}
}
}
}
}
}
どんな洞察も大歓迎です。