首页 > 解决方案 > 不能将元素约束到障碍

问题描述

我遇到了一个问题,我试图将按钮限制在垂直屏障上。当我将要约束到障碍的按钮一侧拖动时,它似乎无法识别障碍。将鼠标悬停在其上并放开后,它不会捕捉到它或应用任何约束。

我尝试从 YouTube 复制一个简单的教程,他将按钮限制在障碍物上,在时间戳链接上没有问题:https ://youtu.be/Ngz5cgLC7m4?t=180 。

我知道您可以将屏障 ID 添加到 Button 的 XML 左侧约束中。但这并不能完全解决根本问题。

我还检查了我的版本当前关于障碍的变更日志(没有任何改变)。

编辑:这是我的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="TextView"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:text="TextView"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView4" />

    <android.support.constraint.Barrier
        android:id="@+id/barrier3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="end"
        app:constraint_referenced_ids="textView5,textView4"
        tools:layout_editor_absoluteX="411dp" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        tools:layout_editor_absoluteX="173dp"
        tools:layout_editor_absoluteY="64dp" />
</android.support.constraint.ConstraintLayout>

标签: android-studioconstraintlayout-barrier

解决方案


图形设计编辑器会出现一些小问题,例如您不能 100% 确定它没有使用absoluteXabsoluteY而不是约束。我总是更喜欢文本编辑器,因为您知道代码,因为您可以查看代码并根据需要修改它。

因此,我检查了您的代码,发现您使用的是absoluteXandabsoluteY而不是按钮的约束。您可以将其限制为障碍

<Button
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button"

    //These two constraints will set the position on Horizontal axis 
    app:layout_constraintStart_toEndOf="@id/barrier3"
    app:layout_constraintEnd_toEndOf="parent"

    //You should replace it as well with constraints.
    tools:layout_editor_absoluteY="64dp" />

现在,如您所见,我已替换absoluteXStart_toEndOfand End_toEndOf。现在,要设置垂直约束,我实际上不明白为什么 y 的位置是 64dp,但你可以做一件事。使用 Top对其进行约束并将其用作marginTopTop您可以使用 Vertical Bias。

您可以将 absoluteY 替换为:

    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintVertical_bias="0.1"

Vertical_bias 0.1会给你类似的结果,它会将你的按钮定位到屏幕尺寸的 10% 并且它是动态的,这意味着它将在任何屏幕尺寸上的相同位置。

只需用此更改您的代码,我希望您能得到答案。如果需要,您可以问其他任何问题。


推荐阅读