用show()和hide()方法来代替转跳fragment的replace()方法,来“保存”上一个fragment的位置
开始学习fragment的时候基本上都是使用如下代码来实现
public void changerButton(Fragment fragment,String s){
FragmentManager aa=getSupportFragmentManager();
FragmentTransaction bb= aa.beginTransaction();
bb.replace(R.id.fragment,fragment,s);
bb.commit();
}
初学的时候基本上都是使用到了replace方法,但是在目前已经很成熟的开发中,却很少使用replace方法(),为什么呢,因为比如说你在某个新闻客户端,看新闻的时候,一不小心手滑点到了旁边的视频按钮。因为刚才的新闻很有趣,然后你有点回新闻按钮,但是这时候如果你是使用的是replace()方法的话,你在从视频的fragment界面转跳会新闻的fragment界面的时候,并不会回到你上次阅读的地方。那这样就很操蛋啊,刚才那条新闻好不容易找到的,在会去找么??!!。这个就是使用replace()方法的缺点。
这时候咱们来使用另一种转跳fragment界面的方法,说是转跳不如说是显示更加贴切一点。代码如下
public void changedfragment(int j) {
FragmentTransaction beginTransaction = getSupportFragmentManager().beginTransaction();
for (int i = 0; i < fragment.size(); i++) {
Fragment f = this.fragment.get(i);
if (j == i) {
if (f.isAdded()) {
beginTransaction.show(f);
} else {
beginTransaction.add(R.id.fy, f);
}
} else {
if (f.isAdded()) {
beginTransaction.hide(f);
}
}
}
beginTransaction.commit();
}
首先来解释一下这个代码。也是和replace()方法的步骤一样,首先先是获得fragment的管理器。然后在循环里面的第一个fragment参数实际上是一个集合,就是往里面添加自己想要添加的fragment界面的。然后进入第一个判断,就是判断当前的fragment界面是不是和遍历的fragment界面是同一个界面。第二个判断是为空判断,判断这个fragment是不是已经被添加了的。如果是被添加了就展示这个fragment就行,如果没有被添加,就把这个添加到事务里面。当当前被选中的界面和遍历的界面不是同一个界面的时候,用事务把这个fragment界面给隐藏起来。
通过上面的方法就能实现,当你看新闻的时候不小心其他按钮的时候,再次返回新闻还是刚刚你阅读的那个界面。