java - Android中的片段重叠
问题描述
我试图在片段之间切换而不丢失以前的内容,所以我决定实现这种方式来做到这一点:
private void loadFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().hide(fragment);
if (!alreadyOpened[currentIndex]) {
alreadyOpened[currentIndex] = true;
fragmentManager.beginTransaction().add(R.id.fragment_container,fragment).commit();
} else {
fragmentManager.beginTransaction().show(fragment).commit();
}
}
使用这种方法,我检查一个片段是否已经打开:如果是,我显示它,如果不是,我添加它。然后我将其声明为“已经打开”。问题是当我在片段之间切换时,我看到所有三个片段都重叠。我该如何解决?这是我调用 loadFragment 方法时的菜单栏:
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.bbn_item1:
currentIndex = 0;
loadFragment(new HomeFragment());
return true;
case R.id.bbn_item2:
currentIndex = 1;
loadFragment(new PopularFragment());
return true;
case R.id.bbn_item3:
currentIndex = 2;
loadFragment(new PlayingFragment());
return true;
}
return false;
}
};
编辑:新代码
List<Fragment> fragments = new ArrayList<>();
private void loadFragment(Fragment fragment) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (alreadyOpened[currentIndex]) {
ft.replace(R.id.fragment_container, fragments.get(currentIndex));
} else {
fragments.add(currentIndex, fragment);
alreadyOpened[currentIndex] = true;
ft.replace(R.id.fragment_container, fragment);
}
ft.addToBackStack(null);
ft.commit();
}
解决方案
您不应该在每次导航点击时创建新的片段。在某处创建一次并将它们保存在List<Fragment> fragments
数组中。之后使用fragmentManager.beginTransaction().replace(R.id.fragment_layout, fragment);
这里是一个小例子:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left); //optional
ft.replace(R.id.fragment_layout, fragments.get(selectedFragment));
ft.addToBackStack(null);
ft.commit();
从您的onNavigationItemSelected
发送selectedFragment
变量中,并匹配fragments
列表中的位置。
编辑:这个怎么样:
public HomeFragment homeFragment;
public PopularFragment popularFragment;
public PlayingFragment playingFragment;
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.bbn_item1:
if(homeFragment == null){ homeFragment =new HomeFragment();}
loadFragment(homeFragment )
return true;
case R.id.bbn_item2:
if(homeFragment == null){ popularFragment =new PopularFragment();}
loadFragment(popularFragment)
return true;
case R.id.bbn_item3:
if(homeFragment == null){ playingFragment =new PlayingFragment();}
loadFragment(playingFragment);
return true;
}
return false;
}
};
public void loadFragment(Fragment fragment){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_left); //optional
ft.replace(R.id.fragment_layout, fragment);
ft.addToBackStack(null);
ft.commit();
}
推荐阅读
- android - 通过“资产”文件夹中的文件夹使用 ExoPlayer 播放视频
- java - Play Framework:如何在错误请求期间再次访问我提交的表单,我的代码无法再次访问列表
- c# - 让 Clipper 将多边形(带孔)合并为一个而不是两个多边形
- vue.js - 如何在Vue多选js中预选
- sql - JSP 中的 JSTL SQL 查询标记数据库结果集
- rest - 通过多个标签获取问题的良好 REST API 设计是什么?
- python - 如何在 Spark 数据框中添加具有序列值的列?
- php - PDO 获取返回零
- android - 我的 DBHelper 和 Fragment 在索引 1 处无法处理参数,因为索引超出范围。该语句有 0 个参数
- python - Python 强制转换和奇怪的类型转换