上一篇文章,我们是在xml中静态添加fragment,但是一些修改或者其他事情是做不了的;
本章我们达成在java代码中灵活添加、删除、替换fragment操作
简单做一个这种页面
public class FragmentActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected 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);
}
@Override
public 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();
}
}
}
这两行代码尽量不要提取成方法成员变量,避免一些未知错误
//获取管理器,开始事务
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中
自定义启动类继承AppCompatActivity;又继承FragmentActivity
getSupportFragmentManager()是FragmentActivity中提供的方法在当前类中直接获取Fragment管理器
开始事务
将当前某个Activity关联控件当中
第一个参数,第二个参数:你要添加的是哪个Fragment,第三个参数:要添加的Fragment在FragmentManager当中的TAG是什么(性能更好)
每次处理完事务Transaction后记得要commit
添加红色,替换为蓝色,移除掉蓝色,就会出现bug;因为当前不是tag_myFragment了而是蓝色view,那还移除个蛋