【问题标题】:Elevation above 2dp causes buttons to disappear高于 2dp 的高度会导致按钮消失
【发布时间】:2017-09-30 11:33:50
【问题描述】:

在下面的代码中,我有一个高度为 8dp 的白色视图。蓝色按钮的高度为 10dp,因此理论上它应该显示。然而,事实并非如此。它只显示不直接位于白色视图上方的部分。我知道这与海拔有关,但我不知道到底是什么。我发现当白色视图=

这是我的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/login_background"
            android:background="@color/colorPrimary" />

        <View
            android:id="@+id/view"
            android:layout_width="@dimen/login_container_width"
            android:layout_height="@dimen/login_container_height"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="@dimen/login_container_margin_top"
            android:background="@drawable/login_container"
            android:elevation="8dp">

        </View>

        <Button
            android:id="@+id/button"
            android:layout_width="190dp"
            android:layout_height="50dp"
            android:layout_marginBottom="52dp"
            android:background="@drawable/login_button"
            android:elevation="10dp"
            android:text="LOGIN"
            android:textColor="@color/white"
            android:textSize="20sp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true" />

    </RelativeLayout>

</LinearLayout>

【问题讨论】:

  • 查看this question 和接受的答案,看看它是否回答了您的问题。
  • 我尝试了接受的答案所说的,但是没有用。没有任何改变。

标签: android android-layout button android-elevation


【解决方案1】:

以下反映this Stack Overflow 问题和接受的答案。

让我们考虑一下您从什么开始。我无权访问您的所有尺寸等,以使以下内容看起来与您的示例完全相同,但基础在那里。下面是基本布局。即使视图的高度为8dp 而按钮的高度为10dp,您也可以看到按钮位于视图下方。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimaryDark">

        <View
            android:id="@+id/view"
            android:layout_width="match_parent"
            android:layout_height="175dp"
            android:layout_alignBottom="@+id/button"
            android:layout_alignParentEnd="true"
            android:layout_alignParentStart="true"
            android:layout_margin="30dp"
            android:background="@android:color/white"
            android:elevation="8dp">

        </View>

        <Button
            android:id="@+id/button"
            android:layout_width="190dp"
            android:layout_height="50dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="52dp"
            android:background="@mipmap/ic_launcher"
            android:elevation="10dp"
            android:text="LOGIN"
            android:textColor="@color/white"
            android:textSize="20sp" />

    </RelativeLayout>

</LinearLayout>

那么,这是为什么呢?这是因为按钮的 XML 中的 android:elevation="10dp" 并没有真正定义高程。相反,按钮的高度由控制 android:elevation 和 android:translationZ 属性的"StateListAnimator" 控制。”(请参阅​​上述问题的已接受答案。)

如果您并不真正关心 StateListAnimator 为您的布局所做的事情,您可以通过在按钮的 XML 中添加 android:stateListAnimator="@null" 来消除它。这是添加此代码后的布局。 (请注意,设计器可能不会立即显示更改;Android Studio 3.0 Beta 6 没有)。因此,您可能需要刷新布局才能看到更改。

如您所见,按钮现在如我们预期的那样位于视图上方。

如果您确实关心StateListAnimator 为您做什么,您将需要定义自己的名称并在上面更改的 XML 语句中输入其名称而不是 @null。我在上面引用的答案是 Android 可能使用的StateListAnimator,因此您可以以此为基础,将高度更改为您喜欢的高度。我还没有尝试过,但它应该可以工作。

【讨论】:

  • 非常感谢!你解释得真好,以至于我能真正理解它,哈哈。为你 +1!
猜你喜欢
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 2015-06-24
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
相关资源
最近更新 更多