Fragment的基本使用及使用中注意的点

Fragment的基本使用方法

  • fragment生命周期

  • fragment依赖于Activity

  • fragment通过getActivity()获取当前所在的Activity

  • fragment通过FragmentManager的findFragmentById()

    或findFragmentByTag()获取fragment

  • fragment与activity多对多关系

//第一步,实例化
AFragment aFragment = new AFragment();
//第二步,添加fragment
getFragmentManager().beginTransaction().add(R.id.frame_container, aFragment).commit();
//或者调用,通常调用这个方法不用commit()
getFragmentManager().beginTransaction().add(R.id.frame_container, aFragment).commitAllowingStateLoss();

//getSupportFragment()与getFragmentManager()区别?

getSupportFragmentManager():

3.0以下,3.0以下没有fragment的api,需要V4包通过此方法间接获取FragmentManager()对象,同时继承FragmentActivity,这样才能获取fragment

getFragmentManager():

3.0以上,有了fragment的api,可直接继承Activity获取fragment对象

//问题点commit()与commitAllowingStateLoss()区别?

commit()需要在onSaveInstanceState()之前调用,如果在之后调用就会出现Can not perform this action after onSaveInstanceState异常的提示

commitAllowingStateLoss()则不会进行onSaveInstanceState()保存前后的判断,则不会出现上面的异常提示

if(bFragment == null){
  bFragment = new BFragment();
}
getFragmentManager().beginTransaction().replace(R.id.frame_container, bFragment).commitAllowingStateLoss();

生命周期相关

  • onAttach方法
    Fragment和Activity建立关联的时候调用(获得activity的传递的值)

  • onCreateView方法
    为Fragment创建视图(加载布局)时调用(给当前的fragment绘制UI布局,可以使用线程更新UI)

  • onActivityCreated方法
    当Activity中的onCreate方法执行完后调用(表示activity执行oncreate方法完成了的时候会调用此方法)

  • onDestroyView方法
    Fragment中的布局被移除时调用(表示fragment销毁相关联的UI布局)

  • onDetach方法
    Fragment和Activity解除关联的时候调用(脱离activity)

		//getActivity()可能为null情况
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
      	mActivity = (Activity)context;	//可能会导致内存泄漏,不推荐
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
      	//遇到getActivity()为空的情况解决方案可以先进行非空判断
      	if(getActivity() != null){
          	//做activity相关操作
        }
    }
}
    //fragment传值的方式
		public static AFragment newInstance(String title){
        AFragment aFragment = new AFragment();
        Bundle bundle = new Bundle();
        bundle.putString("title", title);
        //如果fragment被重新创建,setArgument也不会丢失,系统会通过setArgument重新赋值
        aFragment.setArguments(bundle);	
        return aFragment;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
      	if(getArguments() != null){
          	getArguments().getString("title");	//获取传入的值
        }
    }
//将fragment添加到回退栈中,不至于返回时,只返回到Activity
getFragmentManager().beginTransaction()
  .add(R.id.frame_container, aFragment).addToBackStack(null).commitAllowingStateLoss();
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
				try {
						listener = (listenerImpl)context;		//实现activity对fragment当中监听的接口
        } catch (ClassCastException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
      	btn.setOnClickListener(new View.OnClickListener(){
          listener.onClick("进行方法的回调");	//在此对onClick方法在Activity中进行回调
        });
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值