Android ConstraintLayout-将一个视图置于另一个视图之上

我试图在 Button上面添加一个 ProgressBar(两者都在 ConstraintLayout内部)。

<Button
android:id="@+id/sign_in_button"
android:layout_width="280dp"
android:layout_height="75dp"
android:layout_marginBottom="75dp"
android:layout_marginTop="50dp"
android:text="@string/sign_in"
android:textColor="@color/white"
android:textSize="22sp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/passwordEditText"
app:layout_constraintVertical_bias="0.0"/>


<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@+id/sign_in_button"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="@+id/sign_in_button"
android:layout_marginBottom="8dp"
app:layout_constraintVertical_bias="0.5"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="@+id/sign_in_button"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="@+id/sign_in_button"/>

但是,即使在 onCreateProgressBar上调用 bringToFront,它也总是停留在 Button的后面。

ProgressBar progressBar = (ProgressBar)findViewById(R.id.progressBar);
progressBar.bringToFront();
97911 次浏览

ProgressBar上设置一个高度; 2dp似乎可以工作。

android:elevation="2dp"

您也可以尝试设置 translationZ的建议,在接受的答案,以一个 类似的问题

我也遇到了 这个答案作为一个替代品。

我们需要用机器人: 海拔来控制这个。

android:elevation="10dp"

这个标高属性只能在 API 级别 > = 21中工作。但在下面,它会表现正常。如果我们在 Button 视图下面添加 Progress,它会显示位于另一个视图底部顶部的视图。

您可以简单地定义您想要在上面的视图,然后是应该出现在下面的视图。

对于按钮,请注意它们的提升是由其 stateListAnimator 控制的。Widget.MaterialComponents.Button的 stateListAnimator 的默认高度为 @dimen/mtrl_btn_elevation(2dp)。因此,如果你想显示一个视图顶部的按钮,它应该有一个高度至少2dp。

Android Sutdio 3.5的更新答案:

在更新后的布局编辑器中,现在可以更容易地选择哪个视图将位于前面,正如 Android Studio 发行说明中所演示的那样

. . 此外,蓝色覆盖现在突出显示约束的目标 突出显示在试图约束组件时特别有用 与另一个重叠。

Https://developer.android.com/studio/releases

更简单的是, 如果你拖动视图(复制粘贴或从布局编辑器中的组件树) ,它将得到较低的优先级(因此它将落后于其他视图)

在约束布局中,应使用

翻译

高于您想要下面的视图。

默认情况下,按钮设置为 TransationZ,因此有两个选项

1-使进度条平移 Z 大于按钮升高

ViewCompat.setTranslationZ(progressBar, 5)// to support older api <21

2-make 按钮 TransateZ 到0,这样视图在你的约束布局中依次出现,你可以通过设置按钮的样式来实现这一点

style="@style/Widget.AppCompat.Button.Borderless"

虽然 android:elevation="4dp"traslationz将工作,但对于该 API 级别应至少21。如果由于某种原因您不能这样做,请确保您想要放在顶部的视图在其他视图之后被提及。例如,如果我想在 ImageView 顶部添加 Progress Bar:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
tools:context=".ImageActivity">


<ImageView
android:id="@+id/image_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="6:4"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />


<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

使用升级是可行的,但是它有一些限制,比如它需要 api 级别21 + 而且如果海拔较低(在我的例子中是2dp) ,那么视图在做长点击的时候变得不可见,因此你可以使用一个简单的技巧 用「检视」或「文字检视」取代按钮你可以用这些视图做任何事情,这可以用 buttonView 来完成