当前位置: 首页 > news >正文

天天联盟没网站怎么做标题seo是什么意思

天天联盟没网站怎么做,标题seo是什么意思,网店交易平台网站建设,网站名称及网址简介 LayoutInflater在日常的Android开发中是经常使用的类,常常用于XML中View的加载相关流程。本文主要总结一些其常见api的源码流程。 获取LayoutInflater 我们一般会在Activity的onCreate方法中会通过setContentView方法设置自己的布局layoutId,Act…

简介

LayoutInflater在日常的Android开发中是经常使用的类,常常用于XML中View的加载相关流程。本文主要总结一些其常见api的源码流程。

获取LayoutInflater

我们一般会在Activity的onCreate方法中会通过setContentView方法设置自己的布局layoutId,Activity会将加载View委托给Window。

  	public void setContentView(@LayoutRes int layoutResID) {getWindow().setContentView(layoutResID);initWindowDecorActionBar();}public LayoutInflater getLayoutInflater() {return getWindow().getLayoutInflater();}

而Window对应的实现是PhoneWindow类

@Overridepublic void setContentView(int layoutResID) {if (mContentParent == null) {installDecor();} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {mContentParent.removeAllViews();}*****省略部分代码mLayoutInflater.inflate(layoutResID, mContentParent);}public PhoneWindow(@UiContext Context context) {super(context);mLayoutInflater = LayoutInflater.from(context);****省略部分代码}

从上述可知activity中的相关inflater来自PhoneWindow,其本质来自 LayoutInflater.from(context)

Factory和Factory2

Factory和Factory2是两个接口,用户创建具体的View对象,Factory2继承自Factory,新增了onCreateView 重载API,该api新增了parent参数。

public interface Factory {@NullableView onCreateView(@NonNull String name, @NonNull Context context,@NonNull AttributeSet attrs);}public interface Factory2 extends Factory {@NullableView onCreateView(@Nullable View parent, @NonNull String name,@NonNull Context context, @NonNull AttributeSet attrs);}

上述两个接口主要用在LayoutInflater类inflater()流程中,其中解析xml获取到对应的view描述信息后,调用tryCreateView去创建View。

public abstract class LayoutInflater {@UnsupportedAppUsageprivate Factory mFactory;@UnsupportedAppUsageprivate Factory2 mFactory2;@UnsupportedAppUsageprivate Factory2 mPrivateFactory;View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,boolean ignoreThemeAttr) {//*****省略try {View view = tryCreateView(parent, name, context, attrs);if (view == null) {final Object lastContext = mConstructorArgs[0];mConstructorArgs[0] = context;try {if (-1 == name.indexOf('.')) {view = onCreateView(context, parent, name, attrs);} else {view = createView(context, name, null, attrs);}} finally {mConstructorArgs[0] = lastContext;}}return view;//****}public final View tryCreateView(@Nullable View parent, @NonNull String name,@NonNull Context context,@NonNull AttributeSet attrs) {//*****View view;if (mFactory2 != null) {view = mFactory2.onCreateView(parent, name, context, attrs);} else if (mFactory != null) {view = mFactory.onCreateView(name, context, attrs);} else {view = null;}if (view == null && mPrivateFactory != null) {view = mPrivateFactory.onCreateView(parent, name, context, attrs);}return view;}

可以看到,在tryCreateView中会按优先级去调用对应Factory的onCreateView方法去获取View实例,如果该方法返回空,则createViewFromTag方法会调用layoutInflater的onCreateView方法去创建View。该方法会反射创建View对象。
LayoutInflater中设计的Factory和Factory2相关接口和类,给了开发者自定义View创建和适配的机会。比如应用换肤、framework的View替换等。比如包含TextView的xml设置给AppCompatActivity时,其TextView会被替换成AppCompatTextView。

inflate流程

我们一般使用layoutInflater对象的inflater方法来加载xml中的View。该方法需要关注root和attachToRoot参数,root表示当前待加载的View的父容器。该参数对加载的影响主要是父容器的尺寸和主题对当前View的效果影响。而attachToRoot表示是否将当前待加载的View添加到父容器中,这个还会影响inflate方法返回值,当attachToRoot=true,返回父容器,attachToRoot=false返回当前加载到View。

	public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) 								{return inflate(resource, root, root != null);}public View inflate(XmlPullParser parser, @Nullable ViewGroup root) {return inflate(parser, root, root != null);}public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {final Resources res = getContext().getResources();//如果是预编译的View,则反射创建该View。这里的预编译是指在打包时将xml描述的布局编译成.CompiledView文件。这样创建时不用解析xml。默认预编译为关闭状态View view = tryInflatePrecompiled(resource, res, root, attachToRoot);if (view != null) {return view;}XmlResourceParser parser = res.getLayout(resource);try {return inflate(parser, root, attachToRoot);} finally {parser.close();}}public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {synchronized (mConstructorArgs) {try {advanceToRootNode(parser);final String name = parser.getName();if (TAG_MERGE.equals(name)) {//merge标签时,root必须非NULL,并且attachToRoot必须为true。因为meger标签本身没有parent,无法正确加载。if (root == null || !attachToRoot) {throw new InflateException("<merge /> can be used only with a valid "+ "ViewGroup root and attachToRoot=true");}rInflate(parser, root, inflaterContext, attrs, false);} else {// 根据name创建对应的View,前文我们有提到这个方法final View temp = createViewFromTag(root, name, inflaterContext, attrs);ViewGroup.LayoutParams params = null;if (root != null) {//生成paramsparams = root.generateLayoutParams(attrs);if (!attachToRoot) {// Set the layout params for temp if we are not// attaching. (If we are, we use addView, below)temp.setLayoutParams(params);}}// 加载当前节点的子ViewrInflateChildren(parser, temp, attrs, true);// 如果root不为空并且attachToRoot=true,则把当前加载View添加到root中if (root != null && attachToRoot) {root.addView(temp, params);}//result为返回值,这里root == null || !attachToRoot时返回值时当前View,否则是rootif (root == null || !attachToRoot) {result = temp;}}} //***省略***return result;}}

LayoutInflater创建View

前文我们分析createViewFromTag这个方法时提到,如果factory和factory2创建View时都返回了Null,那么会兜底走LayoutInflater的onCreateView方法,该方法最终会调用createView创建View。我们来看看View是是不是通过反射创建的。

public final View createView(@NonNull Context viewContext, @NonNull String name,@Nullable String prefix, @Nullable AttributeSet attrs)throws ClassNotFoundException, InflateException {//*******Class<? extends View> clazz = null;try {if (constructor == null) {// Class not found in the cache, see if it's real, and try to add it//****//获取View的构造函数并缓存,这样不用每次都去查constructor = clazz.getConstructor(mConstructorSignature);constructor.setAccessible(true);sConstructorMap.put(name, constructor);}//****省略部分代码Object lastContext = mConstructorArgs[0];mConstructorArgs[0] = viewContext;Object[] args = mConstructorArgs;args[1] = attrs;try {//反射创建Viewfinal View view = constructor.newInstance(args);if (view instanceof ViewStub) {//如果是ViewStub,则设置LayoutInflater给它final ViewStub viewStub = (ViewStub) view;viewStub.setLayoutInflater(cloneInContext((Context) args[0]));}return view;} finally {mConstructorArgs[0] = lastContext;}} //***}
http://www.mmbaike.com/news/108868.html

相关文章:

  • 自己的公司怎么做网站淘宝seo对什么内容优化
  • 网站做等保三级建设网络营销专业是干什么的
  • wordpress安装权限管理刷移动关键词优化
  • 网站建设推广平台免费开源网站
  • 合肥房产信息网关键词优化排名首页
  • 网站建设步骤详解全国疫情今天最新消息
  • 如何做医药类网站爱站工具包的主要功能
  • 做批发的有哪些网站江西优化中心
  • 软件开发包括网站开发吗优化推广方案
  • 济南 制作网站 公司吗百度关键词优化曝光行者seo
  • 网站的功能和作用是什么南宁做网站公司
  • 网站快照长期不更新网站如何推广营销
  • 用jquery打造个性网站关键词排名技巧
  • pc网站平台sem是什么职位
  • 网络短剧免费观看广东seo快速排名
  • 做网站的服务器cpu异常2024很有可能再次封城吗
  • seo网站制作seo是什么意思电商
  • 开网店 建网站要钱吗文件外链
  • 自己做的网站如何赚钱吗江苏seo排名
  • discuz插件seo关键词优化策略
  • 网站wap转换找平台推广
  • 网站优化找谁武汉大学人民医院精神卫生中心
  • 廊坊网站建设制作长春网络推广公司哪个好
  • 浙江住房和城乡建设网北京关键词seo
  • 中国中国建设银行网站首页百度官方免费下载
  • dede做网站百度app下载最新版本
  • 营销型网站建设技术指标营销管理制度范本
  • 佛山外贸网站制作外贸网站优化公司
  • 中国服装设计网站网络优化工程师有前途吗
  • 前端培训心得上海哪家优化公司好