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

时间:2020-04-07 07:46:46

标签: android android-fragments android-jetpack android-jetpack-navigation

我正在使用Android Jetpack导航在我的应用程序中的片段之间导航,并使用一个主要活动。我在主要活动中有一个导航主机片段,并在各个片段之间进行了导航。

navController = Navigation.findNavController(this,R.id.nav_host_fragment_container);
BottomNavigationView bottomNavigationView = findViewById(R.id.bot_nav_bar);
NavigationUI.setupWithNavController(bottomNavigationView,navController);

但是我有一个主要问题-每当我导航到另一个片段时,当前片段都会被销毁,而当我向后导航时,它将与视图模型一起重新创建。然后,视图模型再次从存储库中获取数据。

如何解决此问题。我想在选项卡之间导航并加载其他片段,而又不破坏当前片段。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

您可以做到 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”

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;
相关问题