Android Gems — Fragment本质之View管理

本文详细探讨了Fragment的View管理,包括两种定义方式、fragmentId、containerId和tag的含义,以及Fragment View的创建和销毁过程。通过源码分析,揭示了布局XML中和代码动态创建Fragment的区别和原理。
摘要由CSDN通过智能技术生成

上篇文章我们讲了Fragment的生命周期管理,对Fragment整个运行机制都会比较清楚了,这节我们分析Fragment的View管理。

一,Fragment的两种定义方式

1,在layout xml里通过fragment标签定义,这种方式定义的fragment是由LayoutInflater在解析xml文件的时候创建。在Activity的onCreate方法里,会通过setContentView方法设置layout id,继而调用LayoutInflater的inflate方法解析xml。LayoutInflater在解析xml的时候,就会实例化出Fragment。

2,Fragment还可以通过代码动态的new Fragment实例,通过FragmentTransaction的add/replace方法随时添加,上篇文章已经介绍过FragmentManager的addFragment流程。

二,Fragment的fragmentId、containerId、tag的意义

fragmentId和tag都是用来标识fragment自身的,containerId是fragment的View的父控件的id,是View的容器。静态和动态两种Fragment的containerId、fragmentId、tag的生成方式也是不一样的。

1,代码动态创建的Fragment

FragmentTransaction的add和replace都有containerViewId和tag参数,containerViewId就是fragment的containerId,并且fragmentId也同时会设置成和containerId一样。从这点也可以看出如果往同一个ViewGroup里add两个不同的Fragment,那么他们的fragmentId是一样的。fragmentId一样的话,会影响FragmentManager的findFragmentById的结果,这个方法只会返回第一个fragmentId等于目标id的Fragment。tag和fragmentId一样,都是用来标识Fragment自身,如果两个fragment的tag相同,则会影响findFragmentByTag的结果。

2,Layout xml里定义的Fragment

Layout xml方式的fragment的实例化流程是: Activity.onCreate -> Activity.setContentView -> PhoneWindow.setContentView -> LayouInflater.inflate->LayoutInflater.createViewFromTag -> Activity.onCreateView -> FragmentManager.onCreateView,因此在Activity的onCreate的时候会开始Fragment的创建。我们看看FragmentManager的onCreateView方法:

  @Override
  public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {  
      String fname = attrs.getAttributeValue(null, "class");  
      TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.Fragment);  
      if (fname == null) {  
        fname = a.getString(com.android.internal.R.styleable.Fragment_name);  
      }  
      int id = a.getResourceId(com.android.internal.R.styleable.Fragment_id, View.NO_ID);  
      String
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值