前言
今天把對於布局的一些理解寫下來,主要內容包括控件的屬性的繼承關系,控件與容器的屬性的關系,以及各種類的屬性的使用。
控件的屬性種類
通常意義上講,我們在對一個控件進行屬性賦值的時候大體上有種類型的屬性,一種為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等等。