Подтвердить что ты не робот

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

Недавно я начал изучать новый 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... Я попытался их вручную удалить, но когда я вернусь на вкладку "Дизайн" и вернусь на вкладку "Текст", эти регенерировать. Теперь у меня есть три вопроса:

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

Ответ 1

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

  • Есть ли способ сказать Android Studio не генерировать эти данные?

Нет.

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

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

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

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

Ответ 2

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

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

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

Источник

Если вы используете 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>

Ответ 3

Я решил проблему, заменив ConstraintLayout на LinearLayout или RelativeLayout