Android布局揭秘

前言

  今天把对于布局的一些理解写下来,主要内容包括控件的属性的继承关系,控件与容器的属性的关系,以及各种类的属性的使用。

控件的属性种类

  通常意义上讲,我们在对一个控件进行属性赋值的时候大体上有种类型的属性,一种为layout_开头的属性,一种为不是以layout_开头的属性,下面以TextView为例进行说明,如下所示

  

 1 <RelativeLayout
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent" >
 4
 5     <TextView
 6         android:layout_width="wrap_content"
 7         android:layout_height="wrap_content"
 8         android:text="hello_world" />
 9
10 </RelativeLayout>

  我为TextView设置了三个属性layout_width、layout_height以及text,可以看到这三个属性中layout_width、layout_height属性为layout_开头而text没有以Layout_开头。

  以layout_开头的属性为从容器中继承的属性,在这个例子里面即是从RelativeLayout中继承来的,TextView本身并没有此属性。而text则是TextView自身拥有的属性。

  为了说明layout属性为容器属性,我做了下面的例子,把TextView分别放置到RelativeLayout和LinearLayout中,然后对TextView设置layout_centerInParent属性,之所有选择这个属性,是因为这个属性为RelativeLayout所有而LinearLayout没有,实验代码如下

  

 1 <RelativeLayout
 2     android:layout_width="wrap_content"
 3     android:layout_height="wrap_content" >
 4
 5     <TextView
 6         android:layout_width="wrap_content"
 7         android:layout_height="wrap_content"
 8         android:layout_centerInParent="true"
 9         android:text="hello_world" />
10 </RelativeLayout>
11
12 <LinearLayout
13     android:layout_width="wrap_content"
14     android:layout_height="wrap_content" >
15
16     <TextView
17         android:layout_width="wrap_content"
18         android:layout_height="wrap_content"
19         android:layout_centerInParent="true"
20         android:text="hello world2" />
21 </LinearLayout>

  如上进行设置之后会发现,编辑器提示“Invalid layout param in a LinearLayout: layout_centerInParent”,如下所示

  

  通过此实验可以得出结论,layout开头的属性并非TextView所拥有,而是继承的容器中关于布局的属性,继而推而广之,可以得出结论,控件的属性可以分为自身属性和容器中的布局属性。下面就通过TextView和各个布局容器一起来详细分析下属性。

LinearLayout和TextView

  这一小节主要介绍下LinearLayout和TextView的属性,先来看下TextView的属性,及属性继承关系,

  下面为TextView自身所拥有的属性

XML Attributes
Attribute Name
android:autoLink
android:autoText
android:bufferType
android:capitalize
android:cursorVisible
android:digits
android:drawableBottom
android:drawableEnd
android:drawableLeft
android:drawablePadding
android:drawableRight
android:drawableStart
android:drawableTop
android:editable
android:editorExtras
android:ellipsize
android:ems
android:fontFamily
android:freezesText
android:gravity
android:height
android:hint
android:imeActionId
android:imeActionLabel
android:imeOptions
android:includeFontPadding
android:inputMethod
android:inputType
android:lineSpacingExtra
android:lineSpacingMultiplier
android:lines
android:linksClickable
android:marqueeRepeatLimit
android:maxEms
android:maxHeight
android:maxLength
android:maxLines
android:maxWidth
android:minEms
android:minHeight
android:minLines
android:minWidth
android:numeric
android:password
android:phoneNumber
android:privateImeOptions
android:scrollHorizontally
android:selectAllOnFocus
android:shadowColor
android:shadowDx
android:shadowDy
android:shadowRadius
android:singleLine
android:text
android:textAllCaps
android:textAppearance
android:textColor
android:textColorHighlight
android:textColorHint
android:textColorLink
android:textIsSelectable
android:textScaleX
android:textSize
android:textStyle
android:typeface
android:width

  
  TextView继承属性

  

Inherited XML Attributes

From class android.view.View

Attribute Name
android:accessibilityLiveRegion
android:alpha
android:background
android:clickable
android:contentDescription
android:drawingCacheQuality
android:duplicateParentState
android:fadeScrollbars
android:fadingEdgeLength
android:filterTouchesWhenObscured
android:fitsSystemWindows
android:focusable
android:focusableInTouchMode
android:hapticFeedbackEnabled
android:id
android:importantForAccessibility
android:isScrollContainer
android:keepScreenOn
android:layerType
android:layoutDirection
android:longClickable
android:minHeight
android:minWidth
android:nextFocusDown
android:nextFocusForward
android:nextFocusLeft
android:nextFocusRight
android:nextFocusUp
android:onClick
android:padding
android:paddingBottom
android:paddingEnd
android:paddingLeft
android:paddingRight
android:paddingStart
android:paddingTop
android:requiresFadingEdge
android:rotation
android:rotationX
android:rotationY
android:saveEnabled
android:scaleX
android:scaleY
android:scrollX
android:scrollY
android:scrollbarAlwaysDrawHorizontalTrack
android:scrollbarAlwaysDrawVerticalTrack
android:scrollbarDefaultDelayBeforeFade
android:scrollbarFadeDuration
android:scrollbarSize
android:scrollbarStyle
android:scrollbarThumbHorizontal
android:scrollbarThumbVertical
android:scrollbarTrackHorizontal
android:scrollbarTrackVertical
android:scrollbars
android:soundEffectsEnabled
android:tag
android:textAlignment
android:textDirection
android:transformPivotX
android:transformPivotY
android:translationX
android:translationY
android:visibility

  也就是说这两部分加起来就是TextView的全部属性,然而我们在XML编辑器中编辑代码的时候会发现,除了以上属性外还有很多以layout开头的属性可以设置,这些就是容器的属性,下面以LinearLayout为例,实验场景如下

  

 1 <LinearLayout
 2     android:layout_width="wrap_content"
 3     android:layout_height="wrap_content" >
 4
 5     <TextView
 6         android:layout_width="wrap_content"
 7         android:layout_height="wrap_content"
 9         android:text="hello world2" />
10 </LinearLayout>

  下面我们就看下LinearLayout的布局属性,通过LinearLayout.LayoutParams类来体现

  通过帮助文档可以看到,其自身属性为以下内容

  

XML Attributes
Attribute Name
android:layout_gravity
android:layout_weight

  还有继承了两类属性,android.view.ViewGroup.MarginLayoutParams

  

Attribute Name
android:layout_marginBottom
android:layout_marginEnd
android:layout_marginLeft
android:layout_marginRight
android:layout_marginStart
android:layout_marginTop

  和android.view.ViewGroup.LayoutParams

Attribute Name Related Method Description
android:layout_height   Specifies the basic height of the view. 
android:layout_width   Specifies the basic width of the view. 

  以上所有属性就是布局控件提供的布局属性

  所以,TextView可以设置的属性即为自身属性和以上的布局属性。

后记

  以上我们通过LinearLayout和TextView的组合分析了Android中布局的属性使用情况,通过以上的分析使得我们能够了解到控件属性的由来,这样就可以更加随心所欲的进行界面布局了。

  同样的道理,可以去分析RelativeLayout、TableLayout等等。

  

  原文地址:http://www.cnblogs.com/luoaz/p/3947100.html

  

时间: 2024-10-15 03:12:18

Android布局揭秘的相关文章

Android布局---相对布局

Android布局分为五大类:相对布局.线性布局.表格布局.帧布局.网格布局 相对布局 语法格式: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmls:tools=""http://schemas.android.com/tools android:layout_width=" " android:layout_height=&quo

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI.以下是android UI的结构示示意图: 查看源码 /** * Implement this to do your drawing. * * @param canvas the canvas on which the background w

Android布局优化

Android影响布局性能主要是Overdraw(过度绘制),表现在重叠不可见元素的重复绘制会产生额外的开销. Overdraw以颜色划分等级:蓝色:Overdraw1倍:绿色:Overdraw2倍:浅红:Overdraw3倍:暗红;Overdraw4倍以上(需要进行优化). Android布局优化解决措施: 1.合理选择控件 LinearLayout简单易用,效率高,但是使用范围有限. RelativeLayout较复杂,使用范围广,效率稍差. 2.去掉windows默认背景 去掉window

android布局相关

android 让一个控件按钮居于底部的几种方法:http://www.cnblogs.com/zdz8207/archive/2012/12/13/2816906.html android布局--Android fill_parent.wrap_content和match_parent的区别: http://www.cnblogs.com/nikyxxx/archive/2012/06/15/2551390.html android布局属性大全:http://www.cnblogs.com/L

Android布局像素单位

Android布局像素单位有dp.sp.px等三种.设置字体时使用sp,设置长度.高度等属性时可以使用dp或sp,px则表示屏幕实际的像素. dp.sp.px三者之间的区别:dp是与密度无关,sp除了与密度无关外,还与比例无关.在Android中规定以160dpi为基准,即如果每英寸屏幕密度为160,则dp.sp.px都是一样的,即1dp=1sp=1px. 屏幕尺寸:屏幕的对角线长度,单位是英寸,1英寸=2.54厘米. 屏幕分辨率:指横纵向上的像素点数,单位是px,1px=1个像素点,一般以纵向

Android 布局中的include标签使用

Android 布局中的include标签使用 最近在布局时,有好多页面都是有共同特点的,比如标题:一个同样的样式! 如下图所示: 如果给每个页面都单独的写一个标题的布局那就太麻烦了,如果能写一个标题布局,其它页面重用该多好! 这个时候,<include> 就隆重登场了! 写一个标题的布局 title.xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:an

android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V

今天在看布局文件的时候出现 android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V 提醒,google后在网上说是因为sdk版本的问题. 解决方法: 修改选择不同的API就好了,降低版本即可

Android布局中 android:layout_gravity=&quot;bottom&quot;为何不起作用?

在android布局时我们有时会需要将位于LinearLayout布局中的控件放在布局底部,或者是同时想将几个控件底部对齐,此时我们自然会想到使用 android:layout_gravity="bottom" 将控件放在该线性布局底部,但是,但是这样是行不通的,这个问题今天也困扰了我很长时间,以为是自己其他地方布局搞错了或者其他地方搞错了才会出现这种情况,最后没办法查资料才发现以下规律: 在 LinearLayout布局时: 当总布局为水平布局时 即当 android:orienta

android 布局中 layout_gravity、gravity、orientation、layout_weight

线性布局中,有 4 个及其重要的参数,直接决定元素的布局和位置,这四个参数是 android:layout_gravity ( 是本元素相对于父元素的重力方向 ) android:gravity (是本元素所有子元素的重力方向) android:orientation (线性布局以列或行来显示内部子元素) android:layout_weight (线性布局内子元素对未占用空间[水平或垂直]分配权重值,其值越小,权重越大. 前提是子元素 设置了 android:layout_width = "