【问题标题】:Can't use setForeground method on ImageView [duplicate]无法在 ImageView 上使用 setForeground 方法 [重复]
【发布时间】:2016-01-17 01:12:19
【问题描述】:

我想使用 setForeground 方法在我的 ImageView 的中心显示一个“播放”图标,以指示用户如果按下它就会播放视频。

目前我遇到了无法解决的错误:

虽然文档说该方法应该从 API 1 开始可用:

我正在使用 23.0.1 版构建工具针对 API 23 进行定位和编译。我的目标是最低 API 16。

【问题讨论】:

标签: android imageview


【解决方案1】:

那是a documentation bugsetForeground() 存在于 API 级别 1 的 FrameLayout 上;从 API 级别 23 开始,它仅在 View 上。

【讨论】:

  • 好的,谢谢,在我的情况下,您对如何获取播放图标有什么建议吗?我目前正在考虑手动合并常规图像和前景图像可能是我唯一的选择,但也许我错过了一些东西。
  • @Saragis:即兴发挥,将“常规图像”作为ImageView 的背景图像,将播放图标作为ImageView 的实际图像
  • 这个答案有点不正确。 java.lang.NoSuchMethodError: android.widget.ImageView.setForeground at kitkat(19).
  • @bongjaechoe:正如我的回答所说,setForeground() 在 API 级别 23 上被添加到 View。您正试图在 API 级别 19 上使用它。API 级别 19 比 API 级别早几年出现23,所以 setForeground() 当时在 View 上不可用。
  • 如果您将视图包裹在FrameLayout 中并在布局中使用setForground,警告将消失!
【解决方案2】:

由于在 API 级别 1 中为 FrameLayout 添加了 setForeground 方法,作为一种解决方法,您可以将视图包装在 FrameLayout 中,然后在布局中使用 setForeground 方法,它会起作用,例如:

在你的 xml 中:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/fl_item_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/niImageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:contentDescription="@string/imageView_description"
        android:scaleType="fitCenter"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</FrameLayout>

然后在代码中,使用:

holder.flItemContainer.setForeground(ContextCompat.getDrawable(a, R.drawable.play));

【讨论】:

    【解决方案3】:

    你可以改变

    minSdkVersion 16
    

    minSdkVersion 23
    

    import android.support.annotation.RequiresApi;
    给你的班级和这份声明

    @RequiresApi(api = Build.VERSION_CODES.M)
    

    到您在其中使用setForground 方法的活动。

    请注意,@RequiresApi(api = Build.VERSION_CODES.M) 中的 M 代表 API 23

    您可以使用下面的每一项,每一项都代表一个特定的 API,而不是 M

    基础 1
    BASE_1_1 2
    纸杯蛋糕 3
    甜甜圈 4
    埃克莱尔 5
    ECLAIR_0_1 6
    ECLAIR_MR1 7
    FROYO 8
    姜饼 9
    姜饼_MR1 10
    蜂窝 11
    HONEYCOMB_MR1 12
    HONEYCOMB_MR2 13 ICE_CREAM_SANDWICH 14
    ICE_CREAM_SANDWICH_MR1 15
    果冻豆 16
    JELLY_BEAN_MR1 17
    JELLY_BEAN_MR2 18
    奇巧 19
    KITKAT_WATCH 20
    棒棒糖 21 LOLLIPOP_MR1 22
    M 23
    N 24
    N_MR1 25
    O 26
    CUR_DEVELOPMENT 10000

    【讨论】:

    • 不,这是一个文档错误,就像之前的答案中提到的那样。 Google 应该会尽快修复它(希望如此)。
    猜你喜欢
    • 1970-01-01
    • 2012-02-05
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多