android源码--setContentView()和LayoutInflater.inflate()源码分析

查看源代码的网站http://androidxref.com
1.activity中的setContent(id)的源码
这里的getWindow()其实就是PhoneWindow对象,直接在studio中并不能查看,需要借助上面的网站
这里写图片描述
2.在PhoneWindow类中,重要的还是调用了installDecor()方法和LayoutInflater中的inflate方法,其中installDecor()方法中对跟布局进行初始化,这样在使用LayoutInflater方法的时候就将创建好的新布局添加到这个mContentParent布局上。
这里写图片描述
3.主要是对跟布局的初始化
这里写图片描述
4.在generateLayout()方法中
这里写图片描述
重要的就是创建了contentParent并且返回。
这里写图片描述
5.LayoutInflater.from(this).inflate(int resource, ViewGroup root, boolean attachToRoot)
如果是merge标签,那么就直接调用rInflate()方法(后面会有分析),如果不是,那么就开始创建根布局也就是temp
这里写图片描述
在createViewFromTag()中创建一个view,其实就是创建根布局。如果root不为空,那么就调用root.addView(temp,params)这样将新的根布局添加到root中。
这里写图片描述
然后调用rInflateChildren()中进行寻找下一级的view
这里写图片描述
如果root等于null,那么就
这里写图片描述
6.这个是通过name创建相应的view。
这里写图片描述
重要的就是判断name中是否有.字符。如果没有,则证明是系统控件,否则就是自定义的控件。系统控件需要补全类名,然后创建相应的对象。
这里写图片描述
补全相应的全类名
这里写图片描述
补全后都会调用createView()方法,然后通过获取相应的构造器,然后创建其对象然后返回。这里为了提升性能,做了构造器的缓存处理、
这里写图片描述
通过构造器创建其相应的对象。
这里写图片描述
7.调用rInflate()方法
这里写图片描述
这里写图片描述
这里其使用了深度优先遍历。先通过createViewFromTag()方法获取到根布局。然后调用rInflateChildren()方法进行迭代处理,再找到相应的跟布局。最后不断的将view添加到上一级的view中。
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
出现以下报错的原因,改怎么解决,修改哪里2023-06-06 22:04:47.620 3151-3151/com.example.notepad E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.notepad, PID: 3151 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.notepad/com.example.notepad.MainActivity}: android.view.InflateException: Binary XML file line #32: addView(View, LayoutParams) is not supported in AdapterView at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2954) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3089) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1819) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6737) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860) Caused by: android.view.InflateException: Binary XML file line #32: addView(View, LayoutParams) is not supported in AdapterView Caused by: java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView at android.widget.AdapterView.addView(AdapterView.java:503) at android.view.LayoutInflater.rInflate(LayoutInflater.java:867) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824) at android.view.LayoutInflater.rInflate(LayoutInflater.java:866) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824) at android.view.LayoutInflater.inflate(LayoutInflater.java:515) at android.view.LayoutInflater.inflate(LayoutInflater.java:423) at android.view.LayoutInflater.inflate(LayoutInflater.java:374) at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:420) at android.app.Activity.setContentView(Activity.java:2772) at com.example.notepad.MainActivity.onCreate(MainActivity.java:30) at android.app.Activity.performCreate(Activity.java:7144) at android.app.Activity.performCreate(Activity.java:7135) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2934) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3089) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1819) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6737) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:860)
最新发布
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值