2016-06-21 107 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,打开您的布局并保存它。