📜  Android 工具栏上的Android SearchView(1)

📅  最后修改于: 2023-12-03 14:59:16.355000             🧑  作者: Mango

Android工具栏上的Android SearchView

简介

Android SearchView是一个通用的工具栏组件,允许用户在应用程序中输入查询文本。以前需要开发者手动实现搜索功能,但现在可以使用Android SearchView来快速构建搜索功能,而且界面与系统搜索UI一致,提升了用户的使用体验。

SearchView可以使用在Action Bar/ToolBar中,也可以使用在自定义的布局中,我们只需简单的配置即可实现各种搜索需要。

使用步骤
1. 布局文件

在布局文件中添加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:搜索框提示文字
2. 源代码

使用SearchView,我们需要在Activity中进行以下步骤:

2.1 配置SearchView

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
    }
})

2.2 实现SearchView搜索功能

使用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等控件展示搜索结果,同时需要编写相应的逻辑代码,以此来实现更加复杂的搜索需求。