`

Android Layout布局文件里的android: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的三条线
onMeasure 测量View的大小
onLayout 对View的布局进行控制
draw绘制该View,drawChild绘制子VIew
分享到:
评论
1 楼 black_smart 2013-03-14  
   

相关推荐

    Android 五种Layout 布局

    在Android开发中,布局(Layout)是构建用户界面的基础元素,它定义了屏幕上各个组件的排列方式和相互关系。本文将深入探讨Android的五种主要布局:LinearLayout、RelativeLayout、FrameLayout、GridLayout以及...

    Android布局文件的属性值解析

    ### Android布局文件的属性值解析 在Android应用开发过程中,布局文件是构建用户界面的核心组成部分。布局文件通过XML格式定义了界面元素的位置、大小及样式等属性,这些属性的合理设置直接影响到应用的用户体验和...

    Android Layout样式布局

    ### Android Layout样式布局详解 #### 一、概述 在Android应用开发中,界面设计是非常重要的一环,而界面设计的核心就是布局(Layout)。布局决定了应用界面的结构与外观,是用户体验好坏的重要因素之一。本文将...

    Android_如何置底一个View(附_前置声明layout布局文件中的资源ID)

    这里,我们可以将ListView的`android:layout_above`属性设置为Button容器的ID(即`@+id/test_bottom_buttons`),这样ListView就会填满Button所在LinearLayout之上的所有空间。 修改后的XML布局文件应如下所示: `...

    认识Android布局文件

    ### 实验2:垂直方向的Layout布局 创建一个垂直方向的LinearLayout,并在其内部添加多个控件,例如两个TextView和一个Button。通过调整控件的`layout_weight`属性,可以实现控件大小的按比例分配。例如: ```xml ...

    Android页面布局总结

    - 属性值为`true`或`false`:例如`android:layout_centerHorizontal="true"`用于水平居中,`android:layout_alignParentBottom="true"`用于贴近父容器底部等。 - 属性值必须为ID的引用名:例如`android:layout_below...

    Android_layout.rar_android_android 布局_layout

    此外,`android:layout_goneMargin`属性在某个视图不可见时仍会影响其他视图的布局。 4. **FrameLayout**:帧布局主要用于显示单个视图,但也可以叠加多个视图。其主要属性是`android:layout_gravity`,用于设置子...

    androidlayout-marginBottom的值为负数.docx

    在Android布局设计中,`android:layout_margin`属性用于设置View与周围元素的边距,包括`android:layout_marginTop`、`android:layout_marginBottom`、`android:layout_marginLeft`和`android:layout_marginRight`。...

    Android_布局属性大全.pdf

    标题与描述概述的知识点主要集中在Android布局属性的详细介绍,这些属性是Android开发中用于定义界面布局的关键要素。根据所提供的信息,我们可以将知识点分为三大类别: ### 第一类:属性值为布尔型(true/false)的...

    计算器(android)

    ntent" android:layout_height="wrap_content" android:layout_weight="1" android:text="/" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap...

    android layout

    在Android开发中,`Layout`起着至关重要的作用,它用于组织和排列用户界面中的各种视图(View)组件。通过使用不同的布局方式,开发者可以创建出灵活且适应不同屏幕尺寸的应用界面。本文将详细介绍与Android布局相关...

    Android 百分比布局

    百分比布局<android.support.percent.PercentLinearLayout android:id="@+id/tv_solid_number_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft=...

    Android控件大全以及各布局控件的使用方式

    ### Android控件大全及各布局控件的使用详解 #### 一、Android控件概述 Android控件是指在Android应用程序中用于实现用户界面的各种组件。这些控件包括但不限于按钮、文本框、列表视图等。熟悉并掌握这些控件对于...

    android 五大布局介绍附源码范例

    本篇文章将深入探讨Android的五大布局:LinearLayout(线性布局)、FrameLayout(单帧布局)、RelativeLayout(相对布局)、AbsoluteLayout(绝对布局)以及TableLayout(表格布局),并提供源码范例来帮助理解。...

    Android 相对布局实例

    这些规则可以通过XML属性进行定义,如`android:layout_toLeftOf`、`android:layout_below`等。 1. **属性详解**: - `android:layout_alignParentTop="true"`:将视图放置在父布局的顶部。 - `android:layout_...

    Android学习指南之Layout 布局--千锋培训

    【Android学习指南之Layout 布局】 在Android开发中,布局(Layout)是构建用户界面的核心元素,它负责组织和定位应用中的各个视图组件。本指南将着重讲解三种主要的布局类型:LinearLayout、RelativeLayout和...

    android 的相对布局的使用小记

    相对布局的核心在于它的规则属性,如`android:layout_toLeftOf`、`android:layout_toRightOf`、`android:layout_above`、`android:layout_below`等,这些属性用于定义一个视图相对于另一个视图的位置。例如,`...

    android布局管理器代码

    在Android开发中,布局管理器是构建用户界面(UI)的关键元素。它们负责组织和定位UI组件,确保屏幕上的元素合理、美观地排列。本文将深入探讨Android中的常见布局管理器,尤其是基于XML的布局,以及如何在Activity...

Global site tag (gtag.js) - Google Analytics