首页 > 代码库 > addView的相关问题
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的相关问题