Android SearchView未折叠到带有导航组件的新片段中
我正在处理一个包含两个片段的简单活动。两个片段都将searchView作为菜单项。问题是如果我在第一个片段中展开searchview,它在第二个片段中展开,反之亦然;这是我不想要的 碎片是,Android SearchView未折叠到带有导航组件的新片段中,android,android-fragments,android-jetpack,android-jetpack-navigation,Android,Android Fragments,Android Jetpack,Android Jetpack Navigation,我正在处理一个包含两个片段的简单活动。两个片段都将searchView作为菜单项。问题是如果我在第一个片段中展开searchview,它在第二个片段中展开,反之亦然;这是我不想要的 碎片是, class TitleScreen : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? )
class TitleScreen : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_title_screen, container, false)
setHasOptionsMenu(true)
view.findViewById<Button>(R.id.play_btn).setOnClickListener {
Navigation.findNavController(view).navigate(R.id.action_title_screen_to_register)
}
return view
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.search, menu)
super.onCreateOptionsMenu(menu, inflater)
}
}
class Register : Fragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_register, container, false)
setHasOptionsMenu(true)
view.findViewById<Button>(R.id.signup_btn).setOnClickListener {
Navigation.findNavController(view).navigate(R.id.action_register_to_match)
}
return view
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.search, menu)
super.onCreateOptionsMenu(menu, inflater)
}
}
class TitleScreen:Fragment(){
覆盖创建视图(
充气器:布局充气器,容器:视图组?,保存状态:捆绑?
):查看{
val视图=充气机。充气(R.layout.fragment\u title\u屏幕,容器,错误)
设置选项菜单(真)
view.findviewbyd(R.id.play\u btn).setOnClickListener{
导航。findNavController(视图)。导航(R.id.action\u title\u screen\u to\u register)
}
返回视图
}
覆盖创建选项菜单(菜单:菜单,充气机:菜单充气机){
充气器。充气(右菜单。搜索,菜单)
super.onCreateOptions菜单(菜单,充气机)
}
}
类寄存器:Fragment(){
覆盖创建视图(充气机:布局充气机,容器:视图组?,
savedInstanceState:捆绑?:查看{
//为该碎片膨胀布局
val视图=充气机。充气(R.layout.fragment_寄存器,容器,错误)
设置选项菜单(真)
view.findviewbyd(R.id.signup\u btn).setOnClickListener{
导航。findNavController(视图)。导航(R.id.action\u register\u to\u match)
}
返回视图
}
覆盖创建选项菜单(菜单:菜单,充气机:菜单充气机){
充气器。充气(右菜单。搜索,菜单)
super.onCreateOptions菜单(菜单,充气机)
}
}
菜单是
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
android:icon="@drawable/ic_search_24px"
android:title="search"
app:showAsAction="always|collapseActionView" />
</menu>
导航是,
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@+id/title_screen">
<fragment
android:id="@+id/title_screen"
android:name="com.example.android.navigationsample.TitleScreen"
android:label="fragment_title_screen"
tools:layout="@layout/fragment_title_screen">
<action
android:id="@+id/action_title_screen_to_register"
app:destination="@id/register"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"/>
</fragment>
<fragment
android:id="@+id/register"
android:name="com.example.android.navigationsample.Register"
android:label="fragment_register"
tools:layout="@layout/fragment_register"/>
</navigation>
如何在下一个片段中保持菜单折叠?提前感谢。使用不同的
android:id
。菜单系统不知道哪个片段给出了哪个MenuItem
,因此它所看到的都是相同的MenuItem,因此正确地保持其状态。对不同的片段使用不同的android:id
意味着菜单将它们视为具有单独折叠/展开状态的单独菜单项。您能举个例子吗?如何为每个菜单项设置不同的id?@Rondev-使用不同的android:id
你是说我必须为每个片段创建不同的搜索菜单xml文件?我不能在onCreateOptions菜单()中以编程方式更改它吗?@Rondev-任何提供不同ID的方法都可以,是的。我使用ViewCompat.generateViewId()为每个菜单项设置了不同的itemId
但每次使用SearchView导航回片段时,它都会自动清除,因为onQueryTextChange会自动触发。这有什么解决办法吗?我在这件事上有点挣扎