我有一个包含两个子片段Timeline
和Milestones
的活动。这两个片段都包含由自定义Cursor适配器填充的列表视图
这是一个图形表示:
现在,当我在TIMELINE上打开搜索视图时,我输入的内容一切都很好,我得到了理想的结果。但是当我使用some text in the searchview
从时间轴导航到里程碑时,搜索视图不会被清除,因此我也会在里程碑页面上获得过滤结果,并根据我在时间轴中提供的参数。
我正在使用AppCompact lib来开发我的ActionBar。其中的选项卡不是ActionBar选项卡,而是简单的SlidingTabLayout
。
到目前为止,我已尝试使用
。getActivity()supportInvalidateOptionsMenu();在两个片段的onResume()中,不起作用。
我尝试过searchView.setQuery(“”,false) - 不起作用并随机给我一个NPE。
那我在这里想念什么?
答案 0 :(得分:0)
您可以看一下我的示例,其中展示了如何控制片段之间的searchView。
首先。您需要创建BaseFragment,它可以与appBarLayout的活动上下文一起使用。
open class BaseFragment: Fragment() {
lateinit var rootActivity: MainActivity
lateinit var appBarLayout: AppBarLayout
lateinit var searchView: androidx.appcompat.widget.SearchView
override fun onAttach(context: Context) {
super.onAttach(context)
this.rootActivity = context as MainActivity
appBarLayout = rootActivity.findViewById(R.id.app_bar_layout)
searchView = rootActivity.findViewById(R.id.search_input)
}
override fun onResume() {
super.onResume()
resetAppBarLayout()
}
private fun resetAppBarLayout() {
appBarLayout.elevation = 14f
}
fun setupSearch(query: String) {
searchView.visibility = View.VISIBLE
searchView.clearFocus()
when(query.isNotEmpty()) {
true -> {
searchView.setQuery(query, true)
searchView.isIconified = false
}
false -> {
searchView.isIconified = true
searchView.isIconified = true
}
}
}
fun hideSearchKeyboard() {
context?.let {
KeyboardHelper.hideSearchKeyboard(it, searchView.findViewById(R.id.search_src_text))
}
}
fun hideSearch() {
searchView.visibility = View.GONE
searchView.clearFocus()
}
}
第二。从BaseFragment继承片段,重写onResume()方法并通过从BaseFragment调用方法来控制片段中的searchView。像这样的东西。
class FragmentA : BaseFragment() {
private var searchQuery = ""
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.fragment, container, false)
val textView: TextView = root.findViewById(R.id.textView)
textView.text = "Fragment A"
return root
}
override fun onResume() {
super.onResume()
setupSearch()
}
private fun setupSearch() {
searchView.setOnQueryTextListener(object : androidx.appcompat.widget.SearchView.OnQueryTextListener {
override fun onQueryTextChange(newText: String?): Boolean {
when(newText.isNullOrEmpty()) {
true -> searchQuery = ""
false -> searchQuery = newText
}
return true
}
override fun onQueryTextSubmit(query: String?): Boolean {
hideSearchKeyboard()
return true
}
})
super.setupSearch(searchQuery)
}
}
完整示例,您可以在这里https://github.com/yellow-cap/android-manage-searchview