match_parent - constraintlayout programmatically android




Android ConstraintLayout генерирует абсолютные значения (2)

Недавно я начал изучать новый ConstraintLayout в Android Studio 2.2 и заметил, что при добавлении простейшего из представлений редактор макета автоматически генерирует некоторые абсолютные координаты. Вот пример XML:

<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/activity_portfolio"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.abc.Activity"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="81dp">

    <TextView
        android:text="@string/creator_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        tools:layout_editor_absoluteX="246dp"
        tools:layout_editor_absoluteY="479dp"
        android:id="@+id/first_textview"
        app:layout_constraintRight_toRightOf="@+id/activity"
        android:layout_marginEnd="16dp"
        tools:layout_constraintRight_creator="0"
        app:layout_constraintBottom_toBottomOf="@+id/activity"
        android:layout_marginBottom="16dp"
        tools:layout_constraintBottom_creator="0" />
</android.support.constraint.ConstraintLayout>

Обратите внимание на абсолюты, такие как 81dp , 246dp , 479dp ... Я попытался их вручную удалить, но когда я вернусь на вкладку «Дизайн» и вернусь на вкладку «Текст», они будут восстановлены. Теперь у меня есть три вопроса:

  1. Есть ли способ сказать Android Studio не создавать их?
  2. Должен ли я вручную разместить их в dimens.xml ?
  3. Могут ли эти абсолюты вызвать некоторые проблемы с макетами в других устройствах?

Вы заметите, что все абсолютные значения находятся в пространстве имен tools - это означает, что они не компилируются в ваше приложение и не используются ни в чем, кроме инструментов (и в этом случае - визуального редактора). Они просто гарантируют, что переход со вкладки «Дизайн в текст» всегда согласован, при этом базовые файлы остаются стабильными.

  1. Есть ли способ сказать Android Studio не создавать их?

Нет.

  1. Должен ли я вручную разместить их в dimens.xml?

Они полезны только для инструментов и поэтому не должны добавляться в отдельный файл dimens.xml , который будет включен в ваш окончательный APK.

  1. Могут ли эти абсолюты вызвать некоторые проблемы с макетами в других устройствах?

Нет, они используются только инструментами.


Я не уверен, что ваш исходный вопрос содержит весь ваш макет, поскольку он ссылается на виджет с идентификатором @+id/activity , поэтому проблема может быть в другом месте вашего макета.

Убедитесь, что виджет, который существует в ConstraintLayout имеет layout_width или layout_height match_parent .

MATCH_PARENT не поддерживается для виджетов, содержащихся в ConstraintLayout, хотя подобное поведение можно определить с помощью MATCH_CONSTRAINT с соответствующими ограничениями влево / вправо или верхнем / нижнем слове, установленным на «parent».

Source

Если вы используете match_parent , Android Studio будет генерировать эти абсолютные значения, а также заменять match_parent абсолютным измерением.

Основываясь на размещенном макете, у вашего TextView возможно, была layout_width или layout_height match_parent до того, как Android Studio заменила его.

Вы должны заменить android:layout_width="match_parent" с

android:layout_width="0dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndtOf="parent"

android:layout_height="match_parent" с

android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomtOf="parent"

В вашем конкретном макете вы, вероятно, хотите что-то вроде этого:

<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/activity_portfolio"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.abc.Activity">

    <TextView
        android:text="@string/creator_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/first_textview"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="@+id/activity"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="16dp" />
</android.support.constraint.ConstraintLayout>




android-layout