【问题标题】:Why FrameLayout isn't setting Z order correctly in my layout?为什么 FrameLayout 没有在我的布局中正确设置 Z 顺序?
【发布时间】:2016-02-27 11:56:27
【问题描述】:

我有以下布局(这里展示了更简单的设计):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main">
    <FrameLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hey, badge!"
            android:layout_margin="10dp"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="AAAAA"
            android:layout_margin="10dp"
            android:textSize="12sp"
            android:background="#ff00ff"
            android:padding="10dp"
            android:layout_gravity="top|end"
            />
    </FrameLayout>
</RelativeLayout>

我希望用文本“AAAA”设置 TextView 作为 Button 的标记,即放置在右上角的按钮上,但事实并非如此。

相反,当我在带有 Lollipop 的 HTC One M7 或带有 Lollipop 的 Genymotion Nexus 6 上尝试此代码时,屏幕看起来像这样:

当我使用 KitKat 在 Genymotion Nexus 5 上尝试相同的代码时,一切看起来都符合预期,即 第一个视图(按钮)显示在徽章(文本视图)下方

有人知道这里有什么问题吗?

谢谢, 德维蒂

【问题讨论】:

    标签: android android-layout android-framelayout


    【解决方案1】:

    elevation 会导致此问题。它是在 Lollipop 中引入的,也负责 z 排序。将您的布​​局复制到layout-v21 并为按钮设置android:elevation="0dp"

    【讨论】:

    • 成功了,谢谢!但是,我必须为 TextView 添加android:elevation="2dp",然后徽章就会出现。不知道为什么,很有趣。
    • 我忘了说,如果你不想创建多个布局,你可以在棒棒糖上使用View.setElevation(float) 或在pre-lollipop 上使用ViewCompat.setElevation(float) 从代码中设置海拔。
    【解决方案2】:

    我在某个地方的另一个线程上看到了这个,但你可以把它放到你的元素中:

    android:stateListAnimator="@null"
    

    正如其他人所说,lolipop 和 up 中的按钮高度已更改,因此它覆盖了其他元素。

    例如,在下面的按钮视图中,我使用它并显示:

    <FrameLayout
        android:id="@+id/ib_one_container"
    
        android:layout_width="38dp"
        android:layout_height="38dp"
        android:layout_marginLeft="5.3dp"
        android:orientation="vertical"
        android:padding="3dp"
        >
    
    
        <Button
            android:id="@+id/ib"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white"
            android:clickable="true"
            android:gravity="center"
            android:stateListAnimator="@null"
            android:textSize="11sp" />
    
    
        <com.mobile.pomelo.UI.customViews.CustomDiagonalLineView
            android:id="@+id/diagaonal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="visible"
    
            />
    
    
    </FrameLayout>
    

    【讨论】:

      【解决方案3】:

      我使用 FrameLayout 作为进度指示器覆盖时遇到了类似的问题(当我的屏幕忙于加载时)。

      我不想将 XML 添加到我的应用程序中的所有其他元素,所以我只是在我的 FrameLayout 叠加层中添加了一个高程。注意 clickable 属性,它确保点击事件不会传递到下面的按钮。

      进度指示器叠加:

      <?xml version="1.0" encoding="utf-8"?>
      <FrameLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/progress_overlay"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:alpha="0.4"
          android:background="@android:color/black"
          android:animateLayoutChanges="true"
          android:elevation="10dp"
          android:clickable="true"
          android:visibility="gone">
      
          <ProgressBar
              style="?android:attr/progressBarStyleLarge"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:indeterminate="true"/>
      
      </FrameLayout>
      

      在我的其他视图中包含进度指示器:

      <include layout="@layout/progress_overlay"/>
      

      原解决方案来自:https://stackoverflow.com/a/29542951/1912127

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-24
        相关资源
        最近更新 更多