LayoutInflater丢失View的LayoutParams

View view = inflater.inflate(R.layout.item, null); 在使用类似以上方法获取view时会遇到的一个问题就是布局文件中定义的LayoutParams被忽略了。以下三个stackoverflow问题就是这样: http://stackoverflow.com/questions/5288435/layout-params-of-loaded-view-are-ignored http://stackoverflow.com/questions/5026926/making-sense-of-layoutinflater http://stackoverflow.com/questions/2738670/layoutinflater-ignoring-parameters 都说这样使用就可以了: View view = inflater.inflate( R.layout.item /* resource id */, parent /* parent */,false /*attachToRoot*/); 至此问题已经解决了,但是三个问题都没有提到为什么要这样调用才行。 感兴趣的我们到源码里来找答案,LayoutInflater的inflate方法,最后都是调用的同一个方法: public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) 原因自然在这个方法里,大概意思就是只有ViewGroup root不为空才会读取View的LayoutParams。attachToRoot = true的时候,会把View添加到root中。而大多情况不希望被addView到root中,自然要赋值为flase,这样就是上面的解决方案了。 可以参看LayoutInflater的inflate方法相关的源码: ...

五月 6, 2013