三三要成为安卓糕手
上一篇文章,我们是在xml中静态添加fragment,但是一些修改或者其他事情是做不了的;
本章我们达成在java代码中灵活添加、删除、替换fragment操作
一:核心代码展示
简单做一个这种页面
public class FragmentActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_fragment);findViewById(R.id.btn_add).setOnClickListener(this);findViewById(R.id.btn_remove).setOnClickListener(this);findViewById(R.id.btn_replace).setOnClickListener(this);}@Overridepublic void onClick(View v) {MyFragment myFragment = new MyFragment();//获取管理器,开始事务FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();if(v.getId() == R.id.btn_add){//获取管理器,开始事务fragmentTransaction.add(R.id.fcv, myFragment,"tag_myFragment");//提交事务fragmentTransaction.commit();} else if (v.getId() == R.id.btn_remove) {//方式二:id移除,优先用这个Fragment fragment = fragmentManager.findFragmentById(R.id.fcv);fragmentTransaction.remove(fragment);fragmentTransaction.commit();//方式一:直接移除
// fragmentTransaction.remove(myFragment);//方式三:tag移除法
// fragmentTransaction.remove(fragmentManager.findFragmentByTag("tag_myFragment"));} else if (v.getId() == R.id.btn_replace) {fragmentTransaction.replace(R.id.fcv,new BlueFragment(),"tag_BlueFragment");fragmentTransaction.commit();}}
}
1:三种移除方式
- 直接移除new出来的fragment
- id移除,通过FragmentContainer去移除,泛用性更好最推荐。理解成所有Fragment都会抵达的总站,在这里管理更方便
- tag移除,这是Fragment的一个标签
2:获取管理器和开始事务
这两行代码尽量不要提取成方法成员变量,避免一些未知错误
//获取管理器,开始事务FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();fragmentTransaction.add(R.id.fcv, myFragment,"tag_myFragment");
在这段代码中,通过 fragmentTransaction.add(R.id.fcv, myFragment, "tag_myFragment")
这行代码,是将 myFragment
这个 Fragment
实例添加到了 id
为 fcv
的容器,从而实现把 myFragment
对应的布局关联到 R.id.fcv
这个容器里,让 myFragment
的界面能够在该容器所在的位置显示出来。
一句话总结:把myFragment布局关联到R.id_fcv这个FragmentContainer中
(1)getSupportFragmentManager()
自定义启动类继承AppCompatActivity;又继承FragmentActivity
getSupportFragmentManager()是FragmentActivity中提供的方法在当前类中直接获取Fragment管理器
(2)使用事务
开始事务
将当前某个Activity关联控件当中
第一个参数,第二个参数:你要添加的是哪个Fragment,第三个参数:要添加的Fragment在FragmentManager当中的TAG是什么(性能更好)
3:效果
4:注意事项
每次处理完事务Transaction后记得要commit
二:替换的Fragment代码展示
1:为什么更推荐用id移除
添加红色,替换为蓝色,移除掉蓝色,就会出现bug;因为当前不是tag_myFragment了而是蓝色view,那还移除个蛋