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
?
- Могут ли эти абсолюты вызывать некоторые проблемы с макетами на других устройствах?
Ответы
Ответ 1
Вы заметите, что все абсолютные значения находятся в пространстве имен tools
- это означает, что они не скомпилированы в ваше приложение и не используются ни в чем, кроме инструментов (и в этом случае - визуального редактора). Они просто гарантируют, что переход со вкладки "Дизайн в текст" всегда согласован, при этом базовые файлы остаются стабильными.
- Есть ли способ сказать Android Studio не генерировать эти данные?
Нет.
- Должен ли я вручную разместить их в файле dimens.xml?
Они полезны только для инструментов и поэтому не должны добавляться в отдельный файл dimens.xml
, который будет включен в ваш окончательный APK.
- Могут ли эти абсолюты вызывать некоторые проблемы с макетами на других устройствах?
Нет, они используются только инструментами.
Ответ 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