我不想使用搜索视图或第三方库来实现搜索栏。我想使用一个编辑文本视图,我可以自定义它来实现我的搜索栏。我该怎么做?我记得读过一些答案或文章,他们为编辑文本设置了一个属性,使其功能类似于搜索视图。类似于:
<EditText
android:id="@+id/search_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="search view"/>
更新:解释我的应用程序架构的图表我在上面试图做的还有很多其他的并发症,所以现在我正在尝试一种不同的方法。以下是我想做的。我想使用搜索视图作为菜单项的操作视图。我的应用程序遵循单一活动模式,我的活动有两个儿童片段。菜单和工具栏不需要在不同的片段中以不同的方式膨胀,因为它们在两个片段中看起来都是一样的。但问题是,搜索视图应该在不同的片段中表现得不同。因此,在第一个片段中,当调用onQuerySubmit((时,我想使用导航操作打开第二个片段,并使用安全参数将query
传递给第二个碎片。然而,在第二个片段中,我想显示基于第一个片段传递的查询的搜索结果,或者用户到达第二个碎片后可能输入的查询,因为这两个片段都应该具有搜索视图(这就是为什么它在活动中被夸大的原因(。
我可以做的是从这两个片段中获得对父活动的引用并使用onQueryTextSubmit()
,但为此,我必须在这两个碎片中使用setHasOptionsMenu(true)
,这会重置工具栏的状态,并且在配置更改或片段事务时,搜索视图会崩溃,数据会丢失。我不能在片段的任何一个onViewCreated()
上使用onQueryTextSubmit()
,因为活动的onCreateOptionsMenu()
是在onCreate()
之后调用的,如果我从活动中获得对搜索视图菜单项的引用,并试图从片段的任何onViewCreated()
对其执行任何操作,我将获得空指针异常。
在获得对膨胀菜单或其中一个菜单项(本例中为搜索视图(的引用后,是否有一种方法可以在调用活动的onCreateOptionsMenu()
后使用它,而不必在任何一个片段中使用setHasOptionsMenu(true)
和onCreateOptionsMenu()
。
这是我的应用程序的回购链接,如果需要,可以获得更多信息]
确切地说,这不能用EditText来完成,而是用AutoCompleteTextview来完成
<AutoCompleteTextView
android:id="@+id/search_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:name="search view"
android:completionThreshold="1"
android:completionHint="@string/message"
android:inputType="text"
/>
上面的xml代码创建了一个自动完成文本输入字段,当您键入1个单词时,它将开始在下拉列表中显示匹配项(因为完成阈值="1"(。这还不够,你还必须添加一个适配器,它将在下拉菜单中显示搜索到的项目。https://developer.android.com/reference/kotlin/android/widget/AutoCompleteTextView检查这个链接的程序部分。
您可以使用本机SearchView
<androidx.appcompat.widget.SearchView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
更多信息:https://developer.android.com/reference/android/widget/SearchView
通过编程,你可以在kotlin中做类似的事情,(我使用bindingView,但你可以得到id tho(:
binding.YOUREDITTEXT.addTextChangedListener(onTextChanged = { text, _, _, _ ->
filteredList = contacts.filter { it.firstName.contains(text.toString(), true) }
val myAdapter = PersonAdapter(this, filteredList as ArrayList<Person>)
binding.YOURLIST.adapter = myAdapter
})
然后对于on setOnItemClickListener:
if (filteredList != null) {
intent.putExtra("contact", filteredList!![position])
} else {
intent.putExtra("contact", contacts[position])
}
这解决了我的问题