addView的相关问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了addView的相关问题相关的知识,希望对你有一定的参考价值。

   代码中给容器动态添加子View时遇到一些问题,当时还是纠结许久的。擅总结者无敌,写下此篇总结,问题比较的简单,希望对新手有所帮助。

 

使用场景:

情况一:

View view = View.inflate(this, R.layout.item_contact,null);

view.getLayoutParams() == null

情况二:

View view =getLayoutInflater().inflate(R.layout.item_contact, null, false);

view.getLayoutParams() == null

情况三:

View view =getLayoutInflater().inflate(R.layout.item_contact, mContainer, false);

或者:View view =LayoutInflater.from(this).inflate(R.layout.item_contact, mContainer, false);

view.getLayoutParams() != null

 

//添加到指定父容器

mContainer.addView(view);

 

View.inflate(this, R.layout.item_contact, mContainer);

作用:创建一个指定布局的View对象,并加入到mContainer的父容器中。

 

getLayoutInflater().inflate(R.layout.item_contact,mContainer, true);

作用:创建一个指定布局的View对象,并加入到mContainer的父容器中。

 

View.inflate(this,resource, null);

这种方式创建的View对象没有LayoutParams。没指定父容器(null),也就是宽高参数是空的。

此时addView方法中会调用generateDefaultLayoutParams()生成默认的宽高参数:

就是:new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

如果你的原本布局宽高不是wrap_content,wrap_content,那么就有问题了。

 

LayoutInflater.inflate方法

LayoutInflater.inflate(int resource, ViewGroup root,boolean attachToRoot)

resource:资源文件id

root:父容器对象

attachToRoot:是否添加到父容器中

备注:

attachToRoot == true;root会作为创建的View对象的父容器

attachToRoot == false;root会为创建的View对象提供LayoutParams参数

 

对于新手而言,问题可能在于:

View view = View.inflate(this, R.layout.item_contact,null);

mContainer.addView(view);添加到mContainer父容器中

 

问题在于:此时的view是没有LayoutParams的,需要:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(

LinearLayout.LayoutParams.WRAP_CONTENT,

LinearLayout.LayoutParams.MATCH_PARENT);

需要使用:mContainer.addView(view, params);这样才能正确体现View布局的宽高参数。

上述代码相当于如下:

View.inflate(this, R.layout.item_contact, mContainer);//一行代码搞定

而同一个View对象,不能同时有两个父容器,此时就无需再调用addView(view);添加了。

如果不需要对View对象进行操作,还免去创建引用变量的资源消耗。

 

另外一个类似方法:

getLayoutInflater().inflate(int resource, ViewGrouproot, boolean attachToRoot)

事实上,从源码可见:

View.inflate(this, resource, null);//实现原理可归纳为:

LayoutInflater.from(this).inflate(resource, root, root!= null);

 

总结:为容器添加子View的方式:

方式一://方便重新指定LayoutParams

View view = View.inflate(this, R.layout.item_contact,null);

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(...);//重新指定LayoutParams。

mContainer.addView(view, params);

方式二(同一):

View view =LayoutInflater.from(this).inflate(R.layout.item_contact, mContainer, false);

mContainer.addView(view);

 

方式三://适合于使用布局中指定的LayoutParams

View.inflate(this, R.layout.item_contact, mContainer);

方式四(同四):

LayoutInflater.from(this).inflate(R.layout.item_contact,mContainer, true);

 

备注:显然,方式三、四使用更简洁,方式一、二则适用于布局重用于不适合布局中指定的LayoutParams的情况。

 


本文出自 “一剑围城” 博客,请务必保留此出处http://weijiancheng.blog.51cto.com/10190955/1913892

以上是关于addView的相关问题的主要内容,如果未能解决你的问题,请参考以下文章

setContentView() 删除使用 addView() 添加的元素

如何使用 addView 将视图添加到布局?

viewgroup用addview添加的view不显示问题

Android:Layout.addView() 不起作用

以编程方式使用 AddView 时奇怪的上边距

使用 WindowManager.addView 添加动态视图