Android ConstraintLayout生成绝对值

时间:2016-05-29 02:40:18

标签: android android-layout

我最近开始在Android Studio 2.2中学习新的ConstraintLayout,并注意到当我添加最简单的视图时,布局编辑器会自动生成一些绝对坐标。这是一个示例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>

请注意81dp246dp479dp之类的绝对值...我试图手动删除这些,但当我回到“设计”标签并返回到“文本”选项卡,这些重新生成。现在,我有三个问题:

  1. 有没有办法告诉Android Studio不生成这些?
  2. 我应该手动将它们放在dimens.xml
  3. 这些绝对会导致其他设备出现布局问题吗?

3 个答案:

答案 0 :(得分:36)

您会注意到所有绝对值都在tools命名空间中 - 这意味着它们不会编译到您的应用程序中,也不会在工具中使用(在本例中为可视化编辑器) )。它们只是确保从“设计”切换到“文本”选项卡始终保持一致,底层文件保持稳定。

  
      
  1. 有没有办法告诉Android Studio不生成这些?
  2.   

没有

  
      
  1. 我应该手动将它们放在dimens.xml中吗?
  2.   

这些仅适用于工具,因此不应添加到最终APK中包含的单独dimens.xml文件中。

  
      
  1. 这些绝对会导致其他设备出现布局问题吗?
  2.   

不,它们仅供工具使用。

答案 1 :(得分:2)

我不确定您的原始问题是否包含整个布局,因为它引用了ID为@+id/activity的小部件,因此问题可能出现在布局的其他位置。

确保ConstraintLayout中不存在layout_widthlayout_height match_parent的小部件。

  

ConstraintLayout中包含的小部件不支持MATCH_PARENT,但可以使用MATCH_CONSTRAINT定义相似的行为,并将相应的左/右或上/下约束设置为&#34; parent&#34;。

Source

如果您使用match_parent,Android Studio会生成这些绝对值,并将match_parent替换为绝对尺寸。

根据您发布的布局,您的TextView可能在Android Studio取代之前有layout_widthlayout_height match_parent

您应该将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>

答案 2 :(得分:0)

作为给出答案的补充说明,您可以使用设计预览上方工具栏菜单中的魔杖图标。点击推断约束按钮,这将自动在文本字段中添加一些行,并且其中一个工具将转换为约束。

请参见下图:

enter image description here