📅  最后修改于: 2023-12-03 14:59:16.355000             🧑  作者: Mango
Android SearchView是一个通用的工具栏组件,允许用户在应用程序中输入查询文本。以前需要开发者手动实现搜索功能,但现在可以使用Android SearchView来快速构建搜索功能,而且界面与系统搜索UI一致,提升了用户的使用体验。
SearchView可以使用在Action Bar/ToolBar中,也可以使用在自定义的布局中,我们只需简单的配置即可实现各种搜索需要。
在布局文件中添加SearchView,可以使用默认样式(SearchView搜索框),也可以使用自定义布局。
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
app:titleTextColor="@android:color/white">
<SearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:iconifiedByDefault="false"
android:queryHint="Search">
</SearchView>
</androidx.appcompat.widget.Toolbar>
SearchView常用的属性:
android:iconifiedByDefault
:默认是否展开搜索框android:queryHint
:搜索框提示文字使用SearchView,我们需要在Activity中进行以下步骤:
val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
val searchView = findViewById<SearchView>(R.id.search_view)
// 设置SearchView样式
searchView.setIconifiedByDefault(false)
// 监听SearchView的输入变化
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
// 当点击搜索按钮时
override fun onQueryTextSubmit(query: String?): Boolean {
Toast.makeText(this@MainActivity, "Search: $query", Toast.LENGTH_SHORT).show()
return true
}
// 当搜索框文字改变时
override fun onQueryTextChange(newText: String?): Boolean {
return false
}
})
使用SearchView实现搜索功能,我们需要编写一定的逻辑代码,并且需要实现数据源,这里我们使用RecyclerView来展示搜索结果。
class MainActivity : AppCompatActivity() {
// 搜索结果显示RecyclerView
private lateinit var recyclerView: RecyclerView
private lateinit var adapter: MyAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
recyclerView = findViewById(R.id.recycler_view)
adapter = MyAdapter(listOf("A", "B", "C"))
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter
val searchView = findViewById<SearchView>(R.id.search_view)
searchView.setIconifiedByDefault(false)
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
Toast.makeText(this@MainActivity, "$query", Toast.LENGTH_SHORT).show()
getData(query.toString())
return true
}
override fun onQueryTextChange(newText: String?): Boolean {
return false
}
})
}
/**
* 搜索数据源
*
* @param keyword 搜索关键字
*/
private fun getData(keyword: String) {
val data = listOf("A", "B", "C", "D", "E", "F")
val result = if (keyword.isBlank()) {
data
} else {
data.filter {
it.contains(keyword, true)
}
}
adapter.setData(result)
}
class MyAdapter(var dataList: List<String>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(android.R.layout.simple_list_item_1, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.textView.text = dataList[position]
}
override fun getItemCount() = dataList.size
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val textView: TextView = view.findViewById(android.R.id.text1)
}
fun setData(dataList: List<String>) {
this.dataList = dataList
notifyDataSetChanged()
}
}
}
使用Android SearchView能够快速构建搜索功能,而且使用起来十分灵活,适用于不同的使用场景。在实现搜索功能的过程中,我们需要使用到RecyclerView或ListView等控件展示搜索结果,同时需要编写相应的逻辑代码,以此来实现更加复杂的搜索需求。