Android ConstraintLayout - 将一个视图放在另一个视图的顶部

时间:2017-06-04 06:27:31

标签: android android-layout android-constraintlayout

我尝试在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"/>

但即使在bringToFront的{​​{1}}上致电ProgressBar后,它也始终位于onCreate之后。

Button

9 个答案:

答案 0 :(得分:102)

ProgressBar上设置标高; 2dp似乎有效。

android:elevation="2dp"

您还可以尝试按similar question的已接受答案中的建议设置translationZ

作为替代方案,我也遇到了this answer

答案 1 :(得分:3)

在大多数情况下,您可以在要显示在视图下方的视图之后简单地定义要显示在顶部的视图。

答案 2 :(得分:3)

在约束布局中,您应该使用

traslationz

高于您想要的下方视图。

答案 3 :(得分:2)

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

android:elevation="10dp"

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

答案 4 :(得分:1)

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

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

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

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

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

答案 5 :(得分:1)

虽然android:elevation="4dp"traslationz可以工作,但是对于该API级别至少应为21。如果由于某种原因您不能这样做,请确保在后面提及您想要的视图其他意见。例如,如果我要在ImageView顶部显示progressBar:

<?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>

答案 6 :(得分:1)

使用高程是有效的,但它有一些限制,比如它需要 api 级别 21+ 并且如果高程较小(在我的情况下是 2dp),那么在长按时视图会变得不可见,因此您可以使用一个技巧简单地用“视图”或“文本视图”替换按钮您可以做任何事情这些视图可以通过 buttonView 完成

答案 7 :(得分:0)

Android Sutdio 3.5的更新答案:

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

  

..此外,蓝色叠加层现在突出显示了约束的目标。这个   当试图约束到以下组件时,突出显示特别有用   彼此重叠。

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

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

答案 8 :(得分: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>