ConstraintLayoutの制約に一致するように幅を設定する


97

ビューの左側と右側を親ビューのマージンに制限して、割り当てられたスペースを埋めるようにしたいと思います。しかし、いずれにも幅を設定するmatch_parentか、wrap_content同じ結果を生成するように見えます。

(match_parentおよびwrap_contentとは対照的に)match_constraintsに相当するものはありますか?やるmatch_parentwrap_contentレイアウトに影響を与えるか、彼らは新しい制約レイアウトでは無視されますか?

私のお気に入りのプラットフォームにこの新しいレイアウトシステムを愛してください!


1
なぜmatch_parentうまくいかないのですか?
Eugen Martynov 2016年

回答:


120

match_parentはサポートされていません。を使用0dpすると、制約を「残りのものを埋める」のではなく「スケーラブル」と考えることができます。

また、その位置(x、yと幅、高さ)の親に依存0dpする位置によって定義することもできます。match_parent


31
なぜこの受け入れられた答えは何ですか?match_parentは、制約レイアウトではサポートされていません。そして、この答えはそれを実装する方法を与えません。
Daniele Segato 2016

3
match_parentはサポートされていません。
Nicolas Roard 2017年

7
この答えは正しいです。match_parentはサポートされていないことを明確に示しています。また、「match_parent」設定の妥当な代替案を実行するには、制約を左と右の親に設定して0dp(マージン0または適切に選択)すると同じ結果が得られます。この答えで本当に除外された唯一のことは、Arieckの答えですが、両側(または垂直の場合は上下)に制約を設定する必要があります。これは私がそれをする方法であり、私は何の問題もありませんでした。さらに、他のコンポーネントと併用すると、重量設定として機能します。
テキーラマン2017年

誰かがここに来て、それがうまくいかないという答えを求めているなら。ベータで壊れたようです。1.0.2で動作するようです。教訓-ライブラリを凍結し、日和見更新を使用しないでください。
inteist

1
@テキーラマンのコメントが答えになります。彼はそれを実装する方法を正しく指摘しました。両側に0dpマージンで制約を作成すると、トリックが実行されます。
Utkarsh Mankad

168

match_parent許可されていません。ただし、実際には幅と高さを0dpに設定し、上下の制約を「親」に設定できます。

たとえばmatch_parent、要素の幅に制約を課したい場合は、次のようにできます。

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="parent"/>

4
Androidチームは「match_parent」を機能させる必要があります。それは非常に簡単でしょう。match_parentに、アプリが親の開始と終了に制限されている場合と同じ機能を提供するだけです。垂直方向または水平方向の検出が容易になります。
bharv14

しかし、0dpは二重測定になりませんか?
Pramod Garg

25

どうやらmatch_parent

  • NOT OK直下ビューについてConstraintLayout
  • OK直下にあるビューの内側をネストされたビューのConstraintLayout

したがって、ビューをとして機能させる必要がある場合は、次のようにしますmatch_parent

  1. の直接の子供ConstraintLayout使用する必要があります0dp
  2. ネストされた要素 (たとえば、孫からConstraintLayout)は、match_parent

例:

<android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="16dp">

    <android.support.design.widget.TextInputLayout
        android:id="@+id/phoneNumberInputLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/phoneNumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    </android.support.design.widget.TextInputLayout>

ConstraintLayoutにネストされたConstraintLayoutについてはどうでしょうか。この例では、TextInputLayoutをConstraintLayoutに変更しますか?
スーパーユーザー


13

公式ドキュメントから:

重要:MATCH_PARENTは、ConstraintLayoutに含まれるウィジェットには推奨されません。MATCH_CONSTRAINTを使用して対応する左/右または上/下の制約を「親」に設定すると、同様の動作を定義できます。

したがって、MATCH_PARENT効果を達成したい場合は、これを行うことができます:

<TextView
    android:id="@+id/textView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:text="TextView"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

4

アダプタを確認できます。

 1 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater);
 2 - MyLayoutBinding binding = MyLayoutBinding.inflate(layoutInflater, viewGroup, false);

1を使用したときと同じ問題が発生しました。2を試すことができます。


これは金です!ありがとうございました!
grrigore

3

match_parentとしてビューを作成することは直接不可能ですが、少し異なる方法で行うことができますが、StartおよびEndでLeftおよびRight属性を使用することを忘れないでください。RTLサポートを使用している場合は、それが必要になります。

    <Button
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>

2

幅または高さ(parentに一致させる必要があるもの)を0dpに設定し、left、right、top、bottomのマージンを親に一致するように設定します


1

オフィスのドキュメント:https : //developer.android.com/reference/android/support/constraint/ConstraintLayout

ディメンションがMATCH_CONSTRAINTに設定されている場合、デフォルトの動作では、結果のサイズに使用可能なすべてのスペースが割り当てられます。

「MATCH_CONSTRAINT」と同等の0dpを使用

重要:MATCH_PARENTは、ConstraintLayoutに含まれるウィジェットには推奨されません。MATCH_CONSTRAINTを使用して、対応する左/右または上/下の制約を「親」に設定すると、同様の動作を定義できます


0

親の中央にTextViewが必要な場合..
メインレイアウトは制約レイアウトです

<androidx.appcompat.widget.AppCompatTextView
     android:layout_width="0dp"
     android:layout_height="wrap_content"
     android:text="@string/logout"
     app:layout_constraintLeft_toLeftOf="parent"
     app:layout_constraintRight_toRightOf="parent"
     android:gravity="center">
</androidx.appcompat.widget.AppCompatTextView>

0

スクロールビュー内に制約レイアウトがある場合、もう1つ答えを見つけました。

android:fillViewport="true"

スクロールビューへ

そして

android:layout_height="0dp"

制約レイアウト内

例:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
        android:fillViewport="true">

    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="0dp">

// Rest of the views

</androidx.constraintlayout.widget.ConstraintLayout>

</ScrollView>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.