繁体   English   中英

使用底部导航按钮切换时如何不破坏打开的片段

[英]how to not detsroy the fragments opened when switching with bottom navigation buttons

在下面的代码中,我们有一个 TrendsFragment 和一个 ProfileFragment 作为基础片段,它们将在底部导航视图中打开。 我可以打开一个空白片段并从这两个中导航到它。 当我执行 TrendsFragment-profileFragment-BlankFragment-TrendsFRagment 时,BlankFragment 被破坏。 我尝试了很多方法来改变它,但我无法管理它。 我怎样才能让blankFragment活着? 我开始使用导航组件库,因为文档说:

“NavigationUI class 包含的 API 可在用户在菜单项之间移动时自动保存和恢复 state。这些 API 在以下情况下默认实现多个返回堆栈支持:

当您使用 setupWithNavController() 的适当重载将 NavigationView 或 BottomNavigationView 的实例与 NavController 实例相关联时,如添加导航抽屉或底部导航中所述。 当您使用 onNavDestinationSelected() 创建与 NavController 实例托管的目的地相关的自定义导航菜单 UI 时。”

我究竟做错了什么? 请解释清楚,提前谢谢...

public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
ActivityMainBinding binding;
NavController navController;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    NavHostFragment navHostFragment=(NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_container);
    navController = navHostFragment.getNavController();
    NavigationUI.setupWithNavController(binding.forumBottomNav, navController);
}

}

这是我的导航图

<?xml version="1.0" encoding="utf-8"?>
<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"
android:id="@+id/nav_graph"
app:startDestination="@id/trendsFragment">

<fragment
    android:id="@+id/profileFragment"
    android:name="com.yusufemirbektas.bottomnavfrags.ProfileFragment"
    android:label="fragment_profile"
    tools:layout="@layout/fragment_profile" >
    <action
        app:restoreState="true"
        android:id="@+id/action_profileFragment_to_blankFragment"
        app:destination="@id/blankFragment" />
</fragment>
<fragment
    android:id="@+id/trendsFragment"
    android:name="com.yusufemirbektas.bottomnavfrags.TrendsFragment"
    android:label="fragment_trends"
    tools:layout="@layout/fragment_trends" >
    <action
        app:restoreState="true"
        android:id="@+id/action_trendsFragment_to_blankFragment"
        app:destination="@id/blankFragment" />
</fragment>
<fragment
    android:id="@+id/blankFragment"
    android:name="com.yusufemirbektas.bottomnavfrags.BlankFragment"
    android:label="fragment_blank"
    tools:layout="@layout/fragment_blank" >
    <action
        app:restoreState="true"
        android:id="@+id/action_blankFragment_self"
        app:destination="@id/blankFragment" />
</fragment>

趋势片段

public class TrendsFragment extends Fragment {
FragmentsListener listener;
FragmentTrendsBinding binding;
FragmentManager fm;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    fm = getChildFragmentManager();
}

public void setListener(FragmentsListener listener) {
    this.listener = listener;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    binding = FragmentTrendsBinding.inflate(inflater, container, false);
    return binding.getRoot();
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    NavController navController= Navigation.findNavController(view);
    binding.openFragButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            navController.navigate(R.id.action_trendsFragment_to_blankFragment);
        }
    });
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}

@Override
public void onDestroy() {
    super.onDestroy();
    fm = null;
    listener = null;
}
}

个人资料片段

public class ProfileFragment extends Fragment {

private static final String TAG = "ProfileFragment";
FragmentProfileBinding binding;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    binding=FragmentProfileBinding.inflate(inflater,container,false);

    return binding.getRoot();
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    NavController navController= Navigation.findNavController(view);
    binding.openFragButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            navController.navigate(R.id.action_profileFragment_to_blankFragment);
        }
    });
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding=null;
}

@Override
public void onDestroy() {
    super.onDestroy();

}
}

空白片段

public class BlankFragment extends Fragment {

FragmentBlankBinding binding;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    binding = FragmentBlankBinding.inflate(inflater, container, false);
    return binding.getRoot();
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    NavController navController= Navigation.findNavController(view);
    binding.openFragButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            navController.navigate(R.id.action_blankFragment_self);
        }
    });
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    binding = null;
}

@Override
public void onDestroy() {
    super.onDestroy();
}
}

您需要将每个导航图目的地设为顶级目的地。 您可以通过将每个导航目标 ID 作为集合传递给 appbarconfiguration 来实现

BottomNavigationView navView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
        R.id.fragment_profile, R.id.fragment_blank, R.id.fragment_trends)
        .build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_activity_main);
NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
NavigationUI.setupWithNavController(binding.navView, navController);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM