我使用Android Jetpack Navigation在应用程序中的片段之间导航,并使用单个Main Activity。我在主活动中有一个导航主机片段,还有一个在片段之间导航的底部导航。
navController = Navigation.findNavController(this,R.id.nav_host_fragment_container);
BottomNavigationView bottomNavigationView = findViewById(R.id.bot_nav_bar);
NavigationUI.setupWithNavController(bottomNavigationView,navController);
但我有一个主要问题——每当我导航到另一个片段时,当前片段都会被销毁,当我导航回来时,它会与视图模型一起被重新创建。然后视图模型再次从存储库中获取数据。
如何解决此问题。我想在选项卡之间导航并加载其他片段,而不破坏当前片段。
您必须创建自定义NavHostFragment((。这里有一个简单的例子
https://medium.com/@programmer47/navigate-back-with-navigation-component-6ce37ba6964
你可以做到1.从你的片段exp:创建对象
final Fragment frag1 = new Fragment1();
final Fragment frag2 = new Fragment2();
final Fragment frag3 = new Fragment3();
在这之后,你需要从FragmentManager创建像这样的对象
final FragmentManager fm = getSupportFragmentManager();
Fragment active = frag1;
最后像这个一样将片段添加到fm
fm.beginTransaction().add(R.id.main_container, frag3,
"3").hide(frag3).commit();
fm.beginTransaction().add(R.id.main_container, frag2,
"2").hide(frag2).commit();
fm.beginTransaction().add(R.id.main_container,frag1, "1").commit();
工作良好,但不要忘记在xml文件中添加"main_container">
主容器
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".view.activity.MainActivity"
tools:showIn="@layout/activity_main"
android:id="@+id/main_container">
</FrameLayout>
现在需要添加YourActivity
<include
layout="@layout/content_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
现在在actionListener 中
fm.beginTransaction().hide(active).show(frag3).commit();
active = frag3;