Android добавляет другой макет в ConstraintLayout, используя тег include

Я делаю простое приложение для тестирования, используя ConstraintLayout. Но у меня есть проблема.

Вот мой код

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout 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.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.user.myapplication.activity.MainActivity">

    <Button
        android:id="@+id/btn_launch"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="16dp"
        android:text="launch"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/text_view"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_marginEnd="16dp"
        android:layout_marginTop="16dp"
        android:text="Hello World!"
        app:layout_constraintHorizontal_bias="1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn_launch" />

    <include
        layout="@layout/content_main"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/text_view" />

</android.support.constraint.ConstraintLayout>

content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout 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.support.constraint.ConstraintLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="123456"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:text="98765"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:text="abc"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView3" />

</android.support.constraint.ConstraintLayout>

Результат кода

Проблема

Я хочу, чтобы content_main находился в мире Hellow! Текстовый вид.

Я использую RelativeLayout, LinearLayout, ConstraintLayout в элементе content_main. но не работать.

Я нахожу любое решение. Но я просто обнаружил, что как использовать ConstraintLayout.

Тег включения Android не работает в ConstraintLayout?


person BlueBright    schedule 26.04.2017    source источник


Ответы (3)


Тег Android include работает с ConstraintLayout, но вам нужно объявить размер макета, который вы хотите включить, с помощью следующих атрибутов.

<include
     layout="@layout/content_main"
     android:layout_width="100dp"
     android:layout_height="250dp"
     .../>

Для включенного макета с динамической высотой используйте wrap_content в качестве значения в атрибутах layout_height или layout_width тега включения.

<include
    android:id="@+id/input_include"
    layout="@layout/task_input"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

После этого ваши ограничения должны работать.

person Maciej Beimcik    schedule 27.04.2017
comment
Тогда какой смысл включать макет, если в будущем мне придется менять размеры во всех остальных местах, где я его включил, какие-то обходные пути? Я включаю разделительную линию размером 0,3 dp по всему моему приложению и хочу определить ее высоту только в одном месте. - person Ritzor; 28.08.2017
comment
Рекомендуемая практика заключается в том, чтобы не использовать жестко заданные значения, как указано выше. Вместо этого вы создаете файл dimens.xml в res/values ​​вашего проекта Android, куда вы добавляете, скажем, ‹resources› ‹dimen name=included_layout_width›100dp‹/dimen› … ‹/resources› и затем используете его в xml . .. android_layout_width=@dimen/included_layout_width - person Maciej Beimcik; 28.08.2017
comment
wrap_content и match_parent тоже работают. вам просто нужно указать ширину и высоту. они не должны быть просто числами. - person Amir Ziarati; 12.06.2018
comment
при таком подходе включение по-прежнему не отображается в представлении дизайна, необходимо вручную добавить ограничения - person kkarakk; 09.01.2019
comment
@kkarakk попробуйте использовать атрибут tools:showIn в исходном макете, чтобы сделать его видимым в других макетах, которые его содержат. developer.android.com/studio/write/ - person Nikos Hidalgo; 10.09.2019

В макете ограничения определите высоту и ширину, а также ваши ограничения следующим образом:

<include
    app:layout_constraintTop_toBottomOf="@id/custom_members_toolbar_layout"
    app:layout_constraintBottom_toTopOf="@id/file_xfer_bottom_nav_bar"
    android:layout_height="0dp"
    android:layout_width="match_parent"
    layout="@layout/file_xfer_upload_layout"/>

Это автоматически изменит размер высоты в зависимости от ваших ограничений.

Ваше здоровье!

person Derwrecked    schedule 15.10.2019

Не уверен, что идеальное решение, но мне помогло размещение тега include в собственном макете ограничения, например

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/todaysFightLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toTopOf="@+id/tvLatestUpdate"
    app:layout_constraintStart_toStartOf="parent">

<include
    layout="@layout/todays_fight_layout" />

</androidx.constraintlayout.widget.ConstraintLayout>

А затем добавьте ограничения из этого нового макета ограничений к следующему отображаемому элементу, в моем случае это текстовое представление с идентификатором tvLatestUpdate.

person Francislainy Campos    schedule 12.07.2020