![](/img/trans.png)
[英]Switching between fragments with button onClick but bottom navigation icon does not change
[英]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.