2

制約レイアウトで同様の問題がある場合は、お尋ねしたいと思います。フラグメント要素に id タグが含まれていると、フラグメントが正しくフォーマットされません。

不適切なフォーマットのレイアウト

xml で定義されたフラグメントが 1 つだけのアクティビティがあります。

<?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" />

フラグメント制約 1 つの制約レイアウト:

<?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>

フラグメント レイアウトがアクティビティで直接使用されている場合は、すべて問題ありません。

4

1 に答える 1

2

これは、フラグメントでレイアウトを取得するときに、要素の 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"
...

そのため、フラグメントがレイアウトをロードすると、 id を参照しているレイアウト要素がそれをinitial__fragment__layout__holder_CL見つけられないため、ビューを制限できません。

この問題を解決するには、2 つの方法があります。

最初のオプションは、両方の場所で同じ ID を使用することです。

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

2 番目のオプション (間違いなく望ましい) は、ConstraintLayout の新しいバージョンに更新することです (アルファ 5から開始しますが、アルファ 6が利用可能であり、アルファ 5 でいくつかの問題が修正されていることに注意してください)。Alpha 5 では、この正確なケースに対して新しい表記法が導入されました。親 ID を指定する代わりに、次のように使用できます。

app:layout_constraintLeft_toLeftOf="parent"

また、Android Studio 2.2 ベータ 1 では、レイアウト エディターは、id を使用する代わりに、parent への参照を文字列「parent」に自動的に置き換えることに注意してください。したがって、レイアウトを修正する最も簡単な方法は、AS 2.2 ベータ 1 に更新し、gradle ファイルを constraintlayout alpha 6 を指すように変更し、レイアウトを開いて保存することです。

于 2016-08-10T23:07:39.817 に答える