本文主要是介绍Android ----------- LayoutInflater的由来,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本篇主要探索LayoutInflater的由来。
如果我们MainActivity 继承的是 Activity( Activity implements LayoutInflater.Factory2)
在activity中我们可以调用getLayoutInflater() 获得LayoutInflater,而其来自于PhoneWindow中
那 PhoneWindow在何时创建的???
PhoneWindow 在 Activity.attach()中创建。
所以 LayoutInflater.from(context); 中的context 是 Activity 本身
Activity.getSystemService()
ContextThemeWrapper.getSystemService()
上面是一个单例模式
getBaseContext()调用的是contextWrapper.getBaseContext()
这个mBase 是从哪里来的????
在Activity.attach() 中赋的值
而attach的调用在ActivityThread.performLaunchActivity中
而 appContext = ContextImpl
所以回到下面这张图(在上面已经出现过了)
所以getSystemService调用的contextImpl.getSystemService()
SystemServiceRegistry.getSystemService()
SYSTEM_SERVICE_FETCHERS中的数据在SystemServiceRegistry的静态块中初始化的
所以 fetcher = CachedServiceFetcher
在CachedServiceFetcher中@Override
@SuppressWarnings("unchecked")
public final T getService(ContextImpl ctx) {// .......省略代码service = createService(ctx);// .......省略代码return service;
}
所以最终返回的是PhoneLayoutInflater
先做一个小结论:
Activity.getLayoutInflater() = PhoneWindow#mLayoutInflater = PhoneLayoutInflater
额外补充:
如果我们的 MainActivity 继承的是 AppCompatActivity,则在onCreate()中 设置LayoutInflater#Factory2activity.onCreate() -------> AppCompatActivity.onCreate()------> AppCompatDelegateImpl.installViewFactory() ---------- LayoutInflater.setFactory2()而设置的Factory = AppCompatDelegateImpl ( AppCompatDelegateImpl implements LayoutInflater.Factory2 , 其具体实现为 AppCompatViewInflater )
当 setContentView
会调用phoneWindow.setContentView()
在上面解释了PhoneWindow#mLayoutInflater = PhoneLayoutInflater ,后面参照下面博客如何将Xml 转为View
https://blog.csdn.net/l540675759/article/details/78099358
这篇关于Android ----------- LayoutInflater的由来的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!