2016-06-21 105 views
2

我想問你,如果你有約束佈局的類似問題。片段元素包含id標記時,片段格式不正確。奇怪的約束佈局行爲

incorrectly formatted layout

我有活性,在XML定義只有一個片段:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<fragment 
    android:id="@+id/initial__initial_fragment" 
    android:name="com.touch4it.taxi.screens.initial.InitialFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:layout="@layout/initial__fragment__layout" /> 

片段約束一個約束佈局:

<?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" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/initial__fragment__layout__holder_CL" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

    <EditText 
    android:id="@+id/initial__fragment__layout__phone_number_ET" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ems="10" 
    android:inputType="phone" 
    android:text="Name" 
    android:singleLine="true" 
    app:layout_constraintLeft_toLeftOf="@+id/initial__fragment__layout__holder_CL" 
    android:layout_marginStart="16dp" 
    app:layout_constraintTop_toBottomOf="@+id/initial__fragment__layout__user_name_ET" 
    android:layout_marginTop="48dp" 
    app:layout_constraintRight_toRightOf="@+id/initial__fragment__layout__holder_CL" 
    android:layout_marginEnd="16dp" /> 

    <EditText 
    android:id="@+id/initial__fragment__layout__user_name_ET" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ems="10" 
    android:inputType="textPersonName" 
    android:text="Name" 
    android:singleLine="true" 
    app:layout_constraintLeft_toLeftOf="@+id/initial__fragment__layout__holder_CL" 
    android:layout_marginStart="16dp" 
    app:layout_constraintTop_toBottomOf="@+id/initial__fragment__layout__log_in_label_TV" 
    android:layout_marginTop="64dp" 
    app:layout_constraintRight_toRightOf="@+id/initial__fragment__layout__holder_CL" 
    android:layout_marginEnd="16dp" /> 

    <Button 
    android:id="@+id/initial__fragment__layout__login_B" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:text="Button" 
    app:layout_constraintLeft_toLeftOf="@+id/initial__fragment__layout__holder_CL" 
    android:layout_marginStart="16dp" 
    app:layout_constraintRight_toRightOf="@+id/initial__fragment__layout__holder_CL" 
    android:layout_marginEnd="16dp" 
    app:layout_constraintBottom_toBottomOf="@+id/initial__fragment__layout__holder_CL" 
    android:layout_marginBottom="16dp" /> 

    <TextView 
    android:id="@+id/initial__fragment__layout__log_in_label_TV" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" 
    app:layout_constraintLeft_toLeftOf="@+id/initial__fragment__layout__holder_CL" 
    android:layout_marginStart="16dp" 
    app:layout_constraintTop_toTopOf="@+id/initial__fragment__layout__holder_CL" 
    android:layout_marginTop="48dp" 
    app:layout_constraintRight_toRightOf="@+id/initial__fragment__layout__holder_CL" 
    android:layout_marginEnd="16dp" /> 

</android.support.constraint.ConstraintLayout> 

當片段佈局中使用活動直接,一切都很好。

回答

2

這是由於在獲取片段中的佈局時,元素的ID不會是您在定義佈局時使用的ID。例如,在你的代碼中有:

app:layout_constraintLeft_toLeftOf="@+id/initial__fragment__layout__holder_CL" 

並且父元素正確包含ID:

<android.support.constraint.ConstraintLayout 
... 
    android:id="@+id/initial__fragment__layout__holder_CL" 
... 

的問題是,您的片段標籤本身具有不同 ID,initial__initial_fragment

<fragment 
    android:id="@+id/initial__initial_fragment" 
... 

所以當片段加載佈局時,佈局元素wh ich所引用的編號爲initial__fragment__layout__holder_CL,不會找到它,因此視圖不能被約束。

有兩件事可以解決這個問題。

第一種選擇是使用在這兩個地方相同的ID:

<fragment 
    android:id="@+id/initial__fragment__layout__holder_CL" 
... 

第二個選項(絕對preferrable)是更新到ConstraintLayout(從alpha 5開始的新版本 - 但請注意,alpha 6可用並修復了alpha 5中的一些問題)。阿爾法5引入了一個新的符號來表示這個確切的情況下 - 而不必指定父ID,你也可以使用:

app:layout_constraintLeft_toLeftOf="parent" 

還要注意與Android Studio 2.2中的β1,佈局編輯器會自動替換引用父母的字符串「父母」,而不是使用一個ID。因此,修復佈局的最簡單方法是更新到AS 2.2 beta 1,將您的gradle文件更改爲指向constraintlayout alpha 6,打開您的佈局並保存它。