在片段中设置setHasOptionsMenu(true)时,SearchView失去焦点

时间:2019-07-15 10:56:48

标签: android menu fragment toolbar searchview

我将SearchViewsetHasOptionsMenu(true)结合使用时遇到了问题(可能是由onPrepareOptionsMenuonCreateOptionsMenu引起的)。我正在使用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检查)。所以我相信问题就在这里。

有什么办法可以避免通话,或者有其他解决方法吗?谢谢

0 个答案:

没有答案