gpt4 book ai didi

android - 为什么 `android:foreground` 属性不起作用?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:48:47 25 4
gpt4 key购买 nike

看看这个小型 Android 应用程序:

主要 Activity .java:

package io.github.gsaga.toucheventtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

主要 Activity :

<ImageView android:layout_width="match_parent"
android:layout_height="match_parent"
android:foreground="@drawable/ic_launcher_background"
xmlns:android="http://schemas.android.com/apk/res/android" />

android:foreground 指向的图像不显示,但如果我将 foreground 更改为 src 它就会出现activity_main.xml 中的背景。此代码似乎遵循此处描述的说明:

https://developer.android.com/reference/android/view/View.html#attr_android:foreground

为什么 android:foreground 标签在上面的代码中不起作用?

注意:

minSdkVersion19,我在 Android 5.1(API 级别 22)上运行这个应用程序

最佳答案

简答

这是由于 bug自 API 级别 23 以来就存在于 Android 中。


有关行为的更多详细信息

这里是所有 XML 属性的列表以及与通过 FrameLayout 引入的 API 级别将前景可绘制对象设置为 View 相关的相应方法。但是,这些后来在 API 级别 23 中被移入 View

╔════════════════════════════╦═════════════════════════════════════════════════╦═════════════╗
║ XML attribute ║ Method ║ Added in ║
║ ║ ║ (API level) ║
╠════════════════════════════╬═════════════════════════════════════════════════╬═════════════╣
║ android:foreground ║ setForeground(Drawable) ║ 1 ║
╠════════════════════════════╬═════════════════════════════════════════════════╬═════════════╣
║ android:foregroundGravity ║ setForegroundGravity(int gravity) ║ 1 ║
╠════════════════════════════╬═════════════════════════════════════════════════╬═════════════╣
║ android:foregroundTint ║ setForegroundTintMode(PorterDuff.Mode tintMode) ║ 21 ║
╠════════════════════════════╬═════════════════════════════════════════════════╬═════════════╣
║ android:foregroundTintMode ║ setForegroundTintMode(PorterDuff.Mode tintMode) ║ 21 ║
╚════════════════════════════╩═════════════════════════════════════════════════╩═════════════╝
  • Android 文档说 setForeground(Drawable) 添加到 API 1 和 setForegroundTintList (ColorStateList tint)setForegroundTintMode (PorterDuff.Mode tintMode) 在 API 级别 21 中添加到 View。实际上,它们一直存在于 FrameLayout 中,直到它移入 API 23。

  • 在 API 级别 < 23 中,即使不是必需的,您也会收到警告。你可以压制它。参见 this .


现在看看这些属性在不同版本上的工作方式。

╔═══════════╦══════════════════╦══════════════════╗
║ API level ║ By code ║ Using XML ║
╠═══════════╬══════════════════╬══════════════════╣
║ <23 ║ FrameLayout only ║ FrameLayout only ║
╠═══════════╬══════════════════╬══════════════════╣
║ >=23 ║ FrameLayout only ║ All views ║
╚═══════════╩══════════════════╩══════════════════╝


错误原因

当这些属性在 API 级别 23 中移动到 View 时,他们对其进行了一些奇怪的修改,可以称为错误。从 XML 加载属性时,它会检查 View 是否为 FrameLayout,它不存在于我们可用于相同目的的方法中。

查看构造函数,API 级别 23:

case R.styleable.View_foreground:
if (targetSdkVersion >= Build.VERSION_CODES.M || this instanceof FrameLayout) {
setForeground(a.getDrawable(attr));
}
break;

关于android - 为什么 `android:foreground` 属性不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52329249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com