2017-09-27 71 views
3

在ConstraintLayout中使用時,我無法理解邊距的行爲(android:layout_margin*)。邊距似乎只在某些情況下才起作用,我希望有人能向我解釋(或確認它是一個ConstraintLayout錯誤)。ConstraintLayout中的邊距行爲

我有以下的佈局...

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <View 
     android:id="@+id/leftView" 
     android:layout_width="0dp" 
     android:layout_height="100dp" 
     android:layout_marginEnd="20dp" 
     android:background="@android:color/holo_blue_dark" 
     app:layout_constraintEnd_toStartOf="@+id/rightView" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent"/> 

    <View 
     android:id="@+id/rightView" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:background="@android:color/holo_green_light" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintTop_toTopOf="parent"/> 

</android.support.constraint.ConstraintLayout> 

...產生以下輸出...

Expected Output

然而,當我改變從leftView至限rightView ...

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <View 
     android:id="@+id/leftView" 
     android:layout_width="0dp" 
     android:layout_height="100dp" 
     android:background="@android:color/holo_blue_dark" 
     app:layout_constraintEnd_toStartOf="@+id/rightView" 
     app:layout_constraintStart_toStartOf="parent" 
     app:layout_constraintTop_toTopOf="parent"/> 

    <View 
     android:id="@+id/rightView" 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:layout_marginStart="20dp" 
     android:background="@android:color/holo_green_light" 
     app:layout_constraintEnd_toEndOf="parent" 
     app:layout_constraintTop_toTopOf="parent"/> 

</android.support.constraint.ConstraintLayout> 

...保證金意外消失......

Unexpected Output

有人能解釋這是否是預期的行爲,如果是這樣,這是爲什麼?

+0

好奇:layout_constraintEnd_toStartOf = 「@ + ID/rightView」'來:如果你還動'的應用程序,會發生什麼'rightView',通過'app:layout_constraintStart_toEndOf =「@ + id/leftView」'? – stkent

+0

@stkent幾乎和第二種情況一樣。但在這種情況下,除非'LayoutWidth'被設置爲某個值,例如'100dp',否則'LeftView'將填充整個屏幕寬度。我也不明白這種行爲。 –

回答

2

因爲leftview取決於rightview,因此您可以將邊距leftview設置爲rightview

當視圖有餘量時,這意味着視圖給出的空間爲視圖取決於。如果你寫在rightviewandroid:layout_marginStart="20dp"

,它不會leftview給予空間,因爲rightview不是DEPENDINGleftview

+1

謝謝。這可能是對這個問題最清楚和最簡潔的解釋。 – Gus

0

因爲rightView取決於它的父(ConstraintLayout),您可以設置:

app:layout_constraintEnd_toEndOf="parent" 
app:layout_constraintTop_toTopOf="parent" 

parentConstraintLayout。你做了,你讓rightView位於其父母的右上方(ConstraintLayout

因此,您在rightView中使用了android:layout_marginStart="20dp"rightView將在其父母(ConstraintLayout)的左邊緣20dp保留。所以在這種情況下沒有空白。


第二種情況與第一種情況不同。着眼於leftView

leftView總是在rightView的左側,因爲你在leftView

leftView也取決於它的父(ConstraintLayout),因爲你使用的波紋管代碼中使用app:layout_constraintEnd_toStartOf="@+id/rightView"leftView

app:layout_constraintStart_toStartOf="parent" 
app:layout_constraintTop_toTopOf="parent" 

您在使用leftViewandroid:layout_marginEnd="20dp"的意思是leftView將保留在右邊20dprightView。所以在這種情況下有空白。


你可以嘗試使用app:layout_constraintEnd_toEndOf="parent"leftView,你會看到一個不同的。

0

爲了得到你要的結果,你需要建立一個chain。如果鏈的組件之間的所有鏈接都已定義,則鏈正確定義。

在您的代碼中,rightView必須連接到leftView。以下約束添加到rightView

app:layout_constraintLeft_toRightOf="@+id/leftView" 

,並更改leftView現有layout_constraintEnd_toStartOf約束

app:layout_constraintRight_toLefttOf="@+id/rightView"