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

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

Solutions Collecting From Web of "Android ConstraintLayout генерирует абсолютные значения"

Вы заметите, что все абсолютные значения находятся в пространстве имен 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».

Источник

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

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