android 如何使编辑文本视图像搜索栏一样工作?

roejwanj  于 2023-02-27  发布在  Android
关注(0)|答案(3)|浏览(130)

我不想使用搜索视图或第三方库来实现搜索栏。我想使用一个编辑文本视图,我可以完全自定义来实现我的搜索栏。我该如何去做呢?我记得阅读过一些答案或文章,他们设置了一个属性编辑文本,使其功能像一个搜索视图。类似的东西:

<EditText
            android:id="@+id/search_bar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:name="search view"/>

更新:A diagram to explain the architecture of my app我在上面尝试做的事情有很多其他的复杂性,所以现在我尝试一种不同的方法。下面是我想要做的事情。我想要使用搜索视图作为菜单项的动作视图。我的应用遵循单一活动模式,我的活动有两个子片段。菜单和工具栏在不同的片段中不需要有不同的膨胀,因为它们在两个片段中看起来是一样的。但问题是,搜索视图在不同的片段中应该有不同的行为。所以在第一个片段中,当onQuerySubmit()被调用时,我想要使用导航动作打开第二个片段,并使用安全参数将query传递给第二个片段。然而,在第二个片段中,我想要根据第一个片段传递的查询或用户在到达第二个片段后可能输入的查询显示搜索结果,因为这两个片段都应该有搜索视图(这就是为什么它在活动中膨胀)。

我可以做的是从两个片段中获取对父Activity的引用并使用onQueryTextSubmit(),但为此我必须在两个片段中使用setHasOptionsMenu(true),这将重置工具栏的状态,并且在配置更改或片段事务时,搜索视图被折叠,数据丢失。我不能在任何一个片段的onViewCreated()上使用onQueryTextSubmit(),因为活动's onCreateOptionsMenu()onCreate()之后被调用,如果我从Activity中获取对搜索视图菜单项的引用,并尝试从Fragment的onViewCreated()中对其执行任何操作,我将获得空指针异常。
在获得对膨胀菜单或其中一个菜单项(本例中为搜索视图)的引用后,是否有一种方法可以在调用Activity的onCreateOptionsMenu()后使用它,而不必在任何一个片段中使用setHasOptionsMenu(true)onCreateOptionsMenu()
Here's如有需要,请提供指向我的应用程序回购协议的链接以获取更多信息]

h6my8fg2

h6my8fg21#

确切地说,它不能用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个单词时,它将开始在下拉列表中显示匹配项(因为completeionThreshold =“1”)。这还不够,您还必须向其中添加一个适配器,它将从其中在下拉列表中显示搜索到的项目。https://developer.android.com/reference/kotlin/android/widget/AutoCompleteTextView检查程序部件的此链接。

qmelpv7a

qmelpv7a2#

您可以使用本机SearchView

<androidx.appcompat.widget.SearchView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"/>

更多内容请看:https://developer.android.com/reference/android/widget/SearchView

1u4esq0p

1u4esq0p3#

你可以在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
        
    })

则对于setOnItemClickListener上的:

if (filteredList != null) {
            intent.putExtra("contact", filteredList!![position])
        } else {
            intent.putExtra("contact", contacts[position])
        }

这解决了我的问题

相关问题