2014-09-29 38 views
5

在我的水平LinearLayout中,我將一個視圖中的重力設置爲center_vertical,然後嘗試爲第二個視圖設置layout_gravity,但該視圖與第一個視圖中居中的文本排列在一起!設置子視圖的中心重力在水平佈局中更改另一個子視圖的佈局對齊方式?

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" > 
    <TextView 
     android:layout_width="100dp" 
     android:layout_height="200dp" 
     android:layout_gravity="top" 
     android:background="@drawable/border" 
     android:gravity="center_vertical" 
     android:text="layout_gravity=top gravity=center_vertical" > 
    </TextView>    
    <TextView 
     android:layout_width="100dp" 
     android:layout_height="200dp" 
     android:layout_gravity="top" 
     android:background="@drawable/border" 
     android:gravity="top" 
     android:text="layout_gravity=top gravity=top" > 
    </TextView> 
</LinearLayout> 

enter image description here

這裏是相同的代碼,但垂直佈局。 請注意,所需的行爲在垂直佈局中正常工作。

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
    <TextView 
     android:layout_width="200dp" 
     android:layout_height="100dp" 
     android:layout_gravity="left" 
     android:background="@drawable/border" 
     android:gravity="center_horizontal" 
     android:text="layout_gravity=left gravity=center_horizontal" > 
    </TextView>    
    <TextView 
     android:layout_width="200dp" 
     android:layout_height="100dp" 
     android:layout_gravity="right" 
     android:background="@drawable/border" 
     android:gravity="right" 
     android:text="layout_gravity=right gravity=right" > 
    </TextView> 
</LinearLayout> 

enter image description here

我可以只使用一個RelativeLayout的也許另一個嵌套的LinearLayout來解決這個問題。但是我問這個問題是因爲我想知道如果我不瞭解重力和layout_gravity是如何工作的!我瞭解這些基本屬性的工作原理對我來說很重要。謝謝

回答

7

如果你想要一箇中心和一個頂部,那麼你需要添加一個基線對齊標誌LinearLayout

android:baselineAligned="false" 

默認情況下,佈局對齊兒童的基線。當孩子們使用不同的重力值時,這會導致這樣的問題。

與垂直方向的不同之處在於基線無法像水平方向一樣對齊。

參見:

http://developer.android.com/reference/android/widget/LinearLayout.html#attr_android:baselineAligned

附加信息 - 這似乎解釋了這個問題比我好的人:

http://www.doubleencore.com/2013/10/shifty-baseline-alignment/

+0

太棒了。謝謝!!我瘋了。 – 2014-09-29 05:07:31

+0

+1。沒有意識到這一點。 – 2014-09-29 05:13:33

+0

有趣。學到了新的東西:) – Karakuri 2014-09-29 14:35:18

0

gravity是視圖本身如何將其內容定位在由其寬度和高度確定的區域內。 layout_gravity父視圖如何定位父母的區域內的孩子。通常,您只需在LinearLayout上設置gravity即可,而不是在其所有子女上設置layout_gravity

請注意,對於LinearLayouts,gravity僅對非方向的軸有影響,例如,頂部和底部將與水平LinearLayout相關,但左側和右側(或開始和結束)將不相關。

+0

在第一個例子中的第二TextView的具有layout_gravity = 「頂」 。它的父級是水平LinearLayout。爲什麼子視圖的頂部不與父LinearLayout的頂部對齊? – 2014-09-29 05:01:08

0

,如果你想的東西沒有「連接到對方」你想兩個小部件之間的一些空間,然後使用空白窗口小部件和使用權

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" 
android:weightSum="100" > 

<TextView 
    android:layout_width="100dp" 
    android:layout_height="200dp" 

    android:layout_weight="40" 
    android:gravity="center_vertical" 
    android:text="layout_gravity=top gravity=center_vertical" > 
</TextView> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="20" /> 

<TextView 
    android:layout_width="100dp" 
    android:layout_height="200dp" 

    android:layout_weight="40" 
    android:gravity="right" 
    android:text="layout_gravity=top gravity=top" > 
</TextView> 

</LinearLayout> 

Main Answer Image

即你的werent清楚輸出這是我可以解釋爲您所需的輸出..但我會解釋你是如何工作的。 關於更多的權重,你可以去http://developer.android.com/reference/android/widget/package-summary.html

有我被稱爲「小部件」和「小部件的內容」 雖然說到線性佈局與layout_gravity你設置它的重力自我作爲一個「小工具」在主視圖和重力你設置重力的內容在那線性佈局

類似地說,如果你使用layout_gravity(比如等於中心),那麼textview將會在它的空間中居中它將在其寬度居中如果layoutorientation是垂直的,並且將在其高度如果layout_orientation是水平居中)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal"> 

<TextView 
    android:layout_width="200dp" 
    android:layout_height="200dp" 
    android:layout_gravity="center" 
    android:text="Second Activity" /> 



</LinearLayout> 

Horizontal linear_layout

看到相同的在垂直方向

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:layout_width="200dp" 
    android:layout_height="200dp" 
    android:layout_gravity="center" 
    android:text="Second Activity" /> 

</LinearLayout> 

Vertical Linear Layout

也現在看到關於重力當你申請重力TextView的,在TextView的「文本」居中(如果比重=中心)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:layout_width="200dp" 
    android:layout_height="200dp" 
    android:layout_gravity="center" 
    **android:gravity="center"** 
    android:text="Second Activity" /> 

</LinearLayout> 

centerTextVertical

現在,您可以實現重力設置重力內的內容小部件..小部件的「內容」可以是小部件本身.. LinearLayout是一個小部件,在線性佈局中添加其他類型的小部件(按鈕和文本視圖) 因此,將gravity = center設置爲textview會將其內容(即文本)在中心和應用重力的LinearLayout將圍繞它的內容(即的TextView)在中心

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:gravity="center"> 

<TextView 
    android:layout_width="200dp" 
    android:layout_height="200dp" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:text="Second Activity" /> 

</LinearLayout> 

layout_gravity_center