Android ConstraintLayout-将一个视图放在另一个视图之上


105

我正在尝试ProgressBar在上方添加一个Button(两者都在内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"/>

但即使打完电话后bringToFrontProgressBaronCreate,它总是背后的支柱Button

ProgressBar progressBar = (ProgressBar)findViewById(R.id.progressBar);
progressBar.bringToFront();

这太奇怪了,我尝试对您的布局进行一些调整,甚至颠倒了链条,以便进度条限制在编辑文本上,而按钮则限制在进度条上,但是该按钮似乎始终位于进度条的顶部
lelloman

您可以使用FrameLayout吗?试试看,知道在FrameLayout中,z-index由布局内的顺序给出(所以Button 1st,Progress 2nd)
razgraf

我未使用app时检查的passwordEditText在哪里:layout_constraintTop_toBottomOf =“ @ + id / passwordEditText”我可以在顶部看到进度栏,您能提供那个passwordEditText
吗?

Answers:


167

在上设置高程ProgressBar2dp似乎有效。

android:elevation="2dp"

您也可以尝试translationZ按照接受的类似问题的答案中的建议进行设置。

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


17
但是elevation并且translationZ仅适用于>> 21的API,旧API呢?
q126y

1
@ q126y我认为在API 21之前这不会成为问题,因此较旧的API不需要此。我已经在运行API 17的仿真器上进行了尝试,进度条按预期显示在顶部。
Cheticamp

@Cheticamp那么如何处理呢?AS发出警告,它仅适用于API级别21和更高版本。
Ajay S

6
@ q126yViewCompat.setTranslationZ(view, 5)
西尔维娅·H

2
ViewCompat.setElavation(view, 20f)帮助您
sagus_helgy

9

我们需要使用android:elevation来控制它。

android:elevation="10dp"

该海拔属性仅在> = 21的API级别中起作用。但是在此之下,它将正常运行。如果将“进度”添加到“按钮”视图下方,则会在另一个视图顶部的底部显示该视图。


6

在大多数情况下,您可以简单地在想要显示的视图下面定义一个视图。


您如何确保
Coz

@Cristan,最好提供一个代码片段或一个示例。谢谢
blueware

1
我想知道,为什么在问题之后定义了,但为什么ProgressBar不在最上面呢?ButtonProgressBarButton
Michael Osofsky '19

我也认为这也是对的,但是无论我在约束布局顺序中的哪个位置放置imageview,它总是出现在按钮后面
相信


0

更新了Android Sutdio 3.5的答案:

在更新的版式编辑器中,现在可以更轻松地选择哪个视图位于前面,如Android Studio发行说明所示

..此外,蓝色叠加层现在突出显示了约束的目标。当试图约束到与另一个零件重叠的零件时,此突出显示特别有用。

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

甚至更容易,如果向上拖动视图(复制粘贴或从布局编辑器中的组件树中拖动),它将获得较低的优先级(因此它将位于其他视图的后面)


0

您可以像下面这样包装它:将framelayout用作父项,并将porogress栏放置在约束布局之外。这将重叠按钮

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 //your all view inside it with button
 <Button/>......
  .........
 </androidx.constraintlayout.widget.ConstraintLayout>

 <ProgressBar
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</FrameLayout>

0

默认情况下,Button设置了TranslationZ,因此您有两个选择

1-使进度条TranslationZ大于按钮高程

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

2-将按钮TranslateZ设为0,以便视图在“约束布局”中依次显示在上方,您可以通过将样式设置为按钮来实现此目的

style="@style/Widget.AppCompat.Button.Borderless"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.