-
静态添加fragment
①创建一个fragment
②创建布局,把①中的fragment放到布局中
注意:
①必须要有id,否则:Caused by: java.lang.IllegalArgumentException: Binary XML file line #9: Must specify unique android:id, android:tag, or have a parent with an id for com.anfly.fragmentr.AFragment
②布局中必须添加属性name,值该fragment全类名 -
动态的使用Fragment
//1.获得碎片管理器
FragmentManager manager = getFragmentManager();
//2.开始事务
FragmentTransaction tr = manager.beginTransaction();
//3.构建Fragment对象
SoundFragment fragment = new SoundFragment();
//4.替换容器中内容 参数1 右边容器的id,参数2 fragment对象
tr.replace(R.id.container, fragment);
//5.提交事务
tr.commit();
-
Fragment生命周期
①onAttach() : 当Fragment与Activity发生关联时调用。
②onCreate()
③onCreateView() :创建该Fragment的视图
④onActivityCreated() : 当Activity的onCreate方法返回时调用
⑤onStart()
⑥onResume()
⑦onPause()
⑧onStop()
⑨onDestroyView() : 与onCreateView想对应,当该Fragment的 视图被移除时调用
⑩onDestroy()
⑪onDetach() :与onAttach相对应,当Fragment与Activity关联被取消时调用 -
Fragment常用方法
① add() :添加
② remove() : 移除 (从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。)
③ replace() : 替换
④ hide(): 隐藏
⑤ show() : 显示
⑥ detach() : 会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
⑦ attach() : 重建view视图,附加到UI上并显示。
⑧ commit() : 提交一个事务 -
回退栈的管理(暂时不掌握):
①. 调用transaction.addToBackStack(null);可将Fragment加入回退栈,按返回时可返回到上一个Fragment
FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.container,new Fragment2(),"fragment2");
transaction.hide(this);
//将Fragment加入回退栈
transaction.addToBackStack(null);
transaction.commit();
②. 若使用的是FragmentManagermanager=getFragmentManager(),Activity继承的是AppCompatActivity,在某些版本api下按返回键直接退出了Activity,需要手动添加回退逻辑,重写onBackPressed():
@Override
public void onBackPressed() {
FragmentManager manager = getFragmentManager();
int backStackEntryCount = manager.getBackStackEntryCount();
if (backStackEntryCount>0){
manager.popBackStack();
}else {
finish();
}
}
6.Activity传递数据给Fragment
①. 在Activity中创建Bundle数据包,并调用Fragment对象的setArguments(Bundle bundle)方法
Activity中:
mFragmentA = new FragmentA();
Bundle bundle = new Bundle();
bundle.putString("data","来自MainActivity的问候");
mFragmentA.setArguments(bundle);
Fragment中:
Bundle bundle = getArguments();
String a = bundle.getString("a");
-
fragment 与 fragment 之间的传递数据
①通过构造方式传值(不推荐)
②通过FragmentManager找到对应Id或者Tag的Framgment,然后获取里面的数据或方法
③通过它们所在的Activity作为桥梁,可以使用getActivity()或者接口回调,达到获取另一个Fragment数据的目的. -
RadioGroup底部导航集合Fragmentr切换
fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
homeFragment = new HomeFragment();
collectFragment = new CollectFragment();
transaction.add(R.id.tableLayout, homeFragment).hide(collectFragment).commit();
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radioButton:
fm.beginTransaction().hide(collectFragment).show(homeFragment).commit();
break;
case R.id.radioButton2:
fm.beginTransaction().hide(homeFragment).show(collectFragment).commit();
break;
}
}
});
网友评论