我将SearchView
与setHasOptionsMenu(true)
结合使用时遇到了问题(可能是由onPrepareOptionsMenu
和onCreateOptionsMenu
引起的)。我正在使用ViewPager2
库在片段之间进行切换。
首先,代码:
菜单主
<menu ... >
<item
android:id="@+id/action_search"
android:orderInCategory="100"
android:title="@string/action_search"
android:icon="@drawable/ic_search"
app:showAsAction="ifRoom|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>
MainActivity (应该从每个片段中访问SearchView
)
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
val item: MenuItem = menu!!.findItem(R.id.action_search)
val searchView: SearchView = item.actionView as SearchView
searchView.setOnQueryTextListener(mOnQueryTextListener)
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean = when (item?.itemId) {
R.id.action_search -> {
view_pager.setCurrentItem(SEARCH, false)
true
}
else -> {
super.onOptionsItemSelected(item)
}
}
片段
class FragmentClass : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_layout, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// setHasOptionsMenu(true)
}
}
我得到了三个片段,这些片段具有上面的结构以及这些更改:
StartFragment:setHasOptionsMenu(false)
FavoritesFragment:setHasOptionsMenu(true)
SearchFragment:setHasOptionsMenu(false)
问题:
场景1):活动片段为StartFragment。轻按搜索图标后,活动片段将变为SearchFragment,并且SearchView
处于焦点状态并且已打开键盘(需要的行为)。
方案2):活动的片段是收藏夹片段。点击搜索图标后,活动片段将更改为SearchFragment,而没有其他更改。再次点击图标后,SearchView
就会显示并聚焦。
在1)中onCreateOptionsMenu
没有被调用,在2)中否则被调用(用logcat检查)。所以我相信问题就在这里。
有什么办法可以避免通话,或者有其他解决方法吗?谢谢