?selectableItemBackgroundBorderless无法正常工作

20

我正在尝试实现一个视图,该视图使用Android的默认itemBackground样式(但具有在操作栏项目等上使用的椭圆形背景)。但一些原因导致以下视图根本不显示背景。如果我将android:background更改为android:foreground,则仅显示矩形而不是椭圆形。有人知道如何修复吗?

<LinearLayout
    app:visibleGone="@{showProfile}"
    android:layout_width="wrap_content"
    android:layout_height="26dp"
    android:layout_alignParentStart="true"
    android:gravity="center"
    android:paddingStart="16dp"
    android:paddingEnd="16dp">

       <ImageView
            android:background="?selectableItemBackgroundBorderless"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:onClick="@{() -> profileCallback.onClick()}"
            android:src="@drawable/profile_image" />

</LinearLayout>
7个回答

40

你的代码是正确的,但是关键在于父布局也需要设置背景。

试着给父布局设置 android:background="@android:color/transparent" 或者其他颜色作为背景。在你的情况下,它是 LinearLayout。


爱你 --{--{@ - amira

8

那行不太对,请使用以下内容:

android:background="?android:attr/selectableItemBackgroundBorderless"

1
当我使用?attr/selectableItemBackgroundBorderless时(我在另一个项目中已经使用过并且运行良好),我遇到了android.view.InflateException。当我按照您的建议设置了背景后,它就可以正常工作了!谢谢!顺便说一下:我的应用程序主题是android:Theme.Material(旧项目是Theme.AppCompat[...])。 - Filipe Brito
2
在KitKat上的InflateException - Laurent Russier
1
请注意,此功能仅可在API 21及以上版本中使用。 - android developer

3
如果您的API版本在21及以上,可以尝试使用android:background="?android:attr/selectableItemBackgroundBorderless"替代。
然而,在某些情况下(例如在ConstraintLayout中,无论是直接还是间接),这是一个已知的问题:

https://issuetracker.google.com/issues/111819099

绕过的一个例子是使用FrameLayout,仅用于点击效果。在这里:
        <FrameLayout
            android:id="@+id/button" ...
            android:clickable="true" android:focusable="true"
            android:foreground="?attr/selectableItemBackgroundBorderless">

            <androidx.appcompat.widget.AppCompatImageView
                android:layout_width="match_parent" android:layout_height="match_parent" .../>
        </FrameLayout>

如果您的API版本是21或以上,您至少可以设置foregroundTint来改变这个效果的颜色。

仍然只在框架布局背景中显示涟漪效果。在我的情况下,我需要涟漪效果扩展到边界之外。 - King of Masses
1
@KingofMasses 你尝试在父视图上设置 clipChildren="false"clipToPadding="false" 吗? - android developer
是的,但它仍然只显示在我的框架布局周围。也就是说,如果我尝试在RecyclerView的列表项上使用相同的?attr/selectableItemBackgroundBorderless,它会按照我期望的方式显示。但不知道为什么它在Framelayout上不起作用。 - King of Masses
1
@KingofMasses 尝试制作一个 POC。很多时候,我会通过一个小项目来找出原因,而不是在原始项目上尝试。 - android developer
好的,我会尝试并告诉你结果。谢谢。 - King of Masses
对我而言,有效的方法是在所有父视图上设置 clipChildren="false"clipToPadding="false"android:background="<some-bg>" - Michal Vician

2
当我将视图设置为可点击时,问题得到解决。可以添加android:clickable =“true”或在视图上编程添加单击侦听器。

2

我有类似的bug,也许可以帮助到某些人:

如果您的父级是FrameLayout,并且它有另一个带背景的子元素,则它们可能会覆盖您的selectableItemBackgroundBorderless


0

你应该在你的 ImageView 中使用 android:focusable 属性

<ImageView
        android:background="?selectableItemBackgroundBorderless"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:focusable="true"
        android:onClick="@{() -> profileCallback.onClick()}"
        android:src="@drawable/profile_image" />

0
使用 android:foreground="?attr/selectableItemBackgroundBorderless"
  `android:clipChildern="false"  
   android:clipToPadding="false"`

适用于所有父级布局


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接