在不破坏的情况下替换导航主机上的碎片



我使用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;

相关内容

  • 没有找到相关文章