Android Layout的layout_height等属性为什么会不起作用?

有的时候,我们配置好的布局文件,在加载完成添加到我们的Activity中后发现,并没有安装我们设置的属性来布局,比为我们设置了android:layout_marginTop=“100dip”,但是运行程序后发现一点作用都没有,相似的还有layout_height等以android:layout_开头的属性设置都没有作用,这类问题以我们使用Adapter的作为数据源的时候作用居多,因为Adapter里有一个方法是getView,这个返回的VIew是一个从XML布局里加载的,一般如下:

if(convertView==null){
convertView=LayoutInflater.from(mContext).inflate(R.layout.main, null);
}
return convertView;

问题恰恰出在我们的LayoutInflater.from(mContext).inflate(R.layout.main, null);这句代码上,在使用inflate的时候,如果第二个参数(View root)为null,那么将不会加载你的布局文件里的最顶层的那个布局节点的布局相关配置(就是以android:layout_开头的属性)..我们可以看下该方法的实现来说明一下,通过查找源代码,inflate的实现都在这个public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) 方法里定义。。其中一段:

if (root != null) {
   if (DEBUG) {
      System.out.println("Creating params from root: " +root);
   }
   // Create layout params that match root, if supplied
   params = 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);
    }
}

可以看到,当root为null的时候是不会执行params = root.generateLayoutParams(attrs);这段代码的,这段代码就是把xml里的布局配置转为LayoutParams,换句说就是加载我们配置的布局属性,以供布局类(FrameLayout等)在onLayout的时候控制View的大小、位置、对齐等等。。以FrameLayout为例,看下它的generateLayoutParams(attrs)方法。

public LayoutParams generateLayoutParams(AttributeSet attrs) {
        return new FrameLayout.LayoutParams(getContext(), attrs);        
    }

很简单,构造了一个FrameLayout.LayoutParams类,该类集成了MarginParams,增加了一个gravity对其的属性配置。。。

在这里,如果要自定义自己的VIewroup,并且该ViewGroup有一些自定义控制布局的属性设置,就可以通过集成View.MarginParams来扩展布局配置,然后重写generateLayoutParams方法,这样系统框架就会自动使用该布局读取我们在xml中配置的布局属性来控制我们的VIew的位置。。

基于以上分析,我们在使用LayoutInflate的inflate方法的时候一定要保证root参数不能为null,其实这个root就是父View的意思,就是说你把xml转换为一个VIew的时候,该VIew的Parent是root,如果你不想把该View添加到该root里,那么让第三个参数 attachToRoot为false,如果要添加则为true.

说到这个问题了,其实还有一些布局,他们的参数配置要满足一定的条件才会起作用,比如FrameLayout里的View,你要想它的leftMargin生效,必须指定它的layout_gravity为left,同理right对应rightMargin.top和bottom也一样。。在使用时注意即可,多看看源代码。要不然就会莫名起名,不知道哪里的问题。

ViewGroup的三条线:

  1. onMeasure 测量View的大小
  2. onLayout 对View的布局进行控制
  3. draw绘制该View,drawChild绘制子VIew

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏7号代码

Android应用界面开发——简单控件和Activity间传递数据

要想开发一个Android App,开发环境是必不可少的,所以学习之前应该先搭建环境,环境如下:

2153
来自专栏何俊林

Android View框架总结(一)

View和Activity的区别 View有哪些? ViewGroup是什么? 为什么Google产生ViewGroup? View的层级结构是什么? View...

1875
来自专栏向治洪

Android listView异步下载和convertView复用产生的错位问题

1:Item图片显示重复 这个显示重复是指当前行Item显示了之前某行Item的图片。 比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,...

2317
来自专栏上善若水

029android初级篇之android应用的状态栏的颜色

在代码中实现对状态栏颜色的控制,(只对系统版本在android4.4及以上的有效)

793
来自专栏Android机器圈

Android图片处理--缩放

把ImageView或者PhotoView的对象名直接添加到display中就OK 了。

2406
来自专栏Android干货

Android项目实战(二):安卓应用程序退出的三种方法

2785
来自专栏自动化测试实战

Appium定位 5 ——xpath

3205
来自专栏Android知识点总结

2-VVI-材料设计之CardView

891
来自专栏Android干货

安卓开发_浅谈SubMenu(子菜单)

1996
来自专栏Android点滴积累

Android 7.0 PopupWindow 又引入新的问题,Google工程师也不够仔细么

Android7.0 PopupWindow的兼容问题 Android7.0 中对 PopupWindow 这个常用的控件又做了一些改动,修复了以前遗留的一些...

26210

扫码关注云+社区