我需要在 Switch 语句中使用十六进制作为 Cases

I need to use Hexadecimal as the Cases in my Switch statement

所以,基本上我在 XML 中定义了两个颜色整数数组。 第一个数组设置为随机。

int[] materialColors = getResources().getIntArray(R.array.materialColors);
int randomMaterialColor = materialColors[new Random().nextInt(materialColors.length)];

我希望应用程序的状态栏相应地更改为随机选择的深色阴影。

我为此使用了 Switch case。

switch (randomMaterialColor){

        case R.color.red:

            window.setStatusBarColor(getResources().getColor(R.color.reds));
            break;

        case R.color.pink:
            window.setStatusBarColor(getResources().getColor(R.color.pinks));
            break;

        case R.color.purple:
            window.setStatusBarColor(getResources().getColor(R.color.purples));
            break;

        case R.color.deep_purple:
            window.setStatusBarColor(getResources().getColor(R.color.deep_purple));
            break;


        case R.color.indigo:
            window.setStatusBarColor(getResources().getColor(R.color.indigos));
            break;

        case R.color.blue:
            window.setStatusBarColor(getResources().getColor(R.color.blues));
            break;

        case R.color.light_blue:
            window.setStatusBarColor(getResources().getColor(R.color.light_blues));
            break;

        case R.color.cyan:
            window.setStatusBarColor(getResources().getColor(R.color.cyans));
            break;

        case R.color.teal:
            window.setStatusBarColor(getResources().getColor(R.color.teal));
            break;

        case R.color.green:
            window.setStatusBarColor(getResources().getColor(R.color.greens));
            break;

        case R.color.light_green:
            window.setStatusBarColor(getResources().getColor(R.color.light_greens));
            break;

        case R.color.lime:
            window.setStatusBarColor(getResources().getColor(R.color.limes));
            break;

        case R.color.yellow:
            window.setStatusBarColor(getResources().getColor(R.color.yellows));
            break;

        case R.color.amber:
            window.setStatusBarColor(getResources().getColor(R.color.ambers));
            break;

        case R.color.deep_orange:
            window.setStatusBarColor(getResources().getColor(R.color.deep_oranges));
            break;

        case R.color.brown:
            window.setStatusBarColor(getResources().getColor(R.color.browns));
            break;

        case R.color.gray:
            window.setStatusBarColor(getResources().getColor(R.color.grays));
            break;

        case R.color.blue_gray:
            window.setStatusBarColor(getResources().getColor(R.color.blue_grays));
            break;

        default:
            Toast.makeText(this, "Could not detect color!", Toast.LENGTH_SHORT);
    }

应用程序能够运行,但状态栏颜色无法更改。 我无法在 Switch 案例中使用十六进制值。 randomMaterialColors 是一个具有该值的 Integer,但我找不到解决方法。

我该如何解决这个问题?

编辑[更新]

这是 XML 文件。 colors.xml 具有 Hexa 中每种颜色的颜色值。这些来自 Google 的 Material 指南。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="red">#F44336</color>
<color name="pink">#E91E63</color>
<color name="purple">#9C27B0</color>
<color name="deep_purple">#673AB7</color>
<color name="indigo">#3F51B5</color>
<color name="blue">#2196F3</color>
<color name="light_blue">#03A9F4</color>
<color name="cyan">#00BCD4</color>
<color name="teal">#009688</color>
<color name="green">#4CAF50</color>
<color name="light_green">#8BC34A</color>
<color name="lime">#CDDC39</color>
<color name="yellow">#FFEB3B</color>
<color name="amber">#FF9800</color>
<color name="deep_orange">#FF5722</color>
<color name="brown">#795548</color>
<color name="gray">#9E9E9E</color>
<color name="blue_gray">#607D8B</color>
<string-array name="materialColors">
<item>@color/red</item>
<item>@color/pink</item>
<item>@color/purple</item>
<item>@color/deep_purple</item>
<item>@color/indigo</item>
<item>@color/blue</item>
<item>@color/light_blue</item>
<item>@color/cyan</item>
<item>@color/teal</item>
<item>@color/green</item>
<item>@color/light_green</item>
<item>@color/lime</item>
<item>@color/yellow</item>
<item>@color/amber</item>
<item>@color/deep_orange</item>
<item>@color/brown</item>
<item>@color/gray</item>
<item>@color/blue_gray</item>
</string-array>
</resources>    

根据文档,除了设置颜色之外,您还需要设置一些标志。试试下面的代码。

Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(activity.getResources().getColor(R.color.example_color));

设置那些标志。这应该有效。

[编辑]更新

问题来了。数字 grandomMaterialColorinteger 值,并且您将该整数值与 R.color.red 进行比较具有 整数 值,例如 21453698789,这将 永远不会满足 这种情况。

为此,您可以做一件事。由于您已经在 XML 中定义了颜色列表,并且您知道该值在该数组中的确切位置。您可以按如下方式修改switch case。

int[] materialColors = getResources().getIntArray(R.array.rainbow);
Random ranom=new Random();
int randomMaterialColor=ranom.nextInt(materialColors.length-1);

switch (randomMaterialColor){

    case 0:

        window.setStatusBarColor(getResources().getColor(R.color.reds));
        break;

    case 1:
        window.setStatusBarColor(getResources().getColor(R.color.pinks));
        break;

    case 2:
        window.setStatusBarColor(getResources().getColor(R.color.purples));
        break;

    case 3:
        window.setStatusBarColor(getResources().getColor(R.color.deep_purple));
        break;


    case 4:
        window.setStatusBarColor(getResources().getColor(R.color.indigos));
        break;

    case 5:
        window.setStatusBarColor(getResources().getColor(R.color.blues));
        break;

    case 6:
        window.setStatusBarColor(getResources().getColor(R.color.light_blues));
        break;

    case 7:
        window.setStatusBarColor(getResources().getColor(R.color.cyans));
        break;

    case 8:
        window.setStatusBarColor(getResources().getColor(R.color.teal));
        break;

    case 9:
        window.setStatusBarColor(getResources().getColor(R.color.greens));
        break;

    case 10:
        window.setStatusBarColor(getResources().getColor(R.color.light_greens));
        break;

    case 11:
        window.setStatusBarColor(getResources().getColor(R.color.limes));
        break;

    case 12:
        window.setStatusBarColor(getResources().getColor(R.color.yellows));
        break;

    case 13:
        window.setStatusBarColor(getResources().getColor(R.color.ambers));
        break;

    case 14:
        window.setStatusBarColor(getResources().getColor(R.color.deep_oranges));
        break;

    case 15:
        window.setStatusBarColor(getResources().getColor(R.color.browns));
        break;

    case 16:
        window.setStatusBarColor(getResources().getColor(R.color.grays));
        break;

    case 17:
        window.setStatusBarColor(getResources().getColor(R.color.blue_grays));
        break;

    default:
        Toast.makeText(this, "Could not detect color!", Toast.LENGTH_SHORT);
}

一样解析颜色值
Color.parseColor(myColor);//myColor in hexadecimal.

它是returns整数值。

您可以尝试其他选项。创建一个包含所有颜色名称的附加字符串数组,如红色、粉色、紫色等。然后你从数组中得到一个随机颜色名称,如下所示:

String[] materialColorNames = getResources().getStringArray(R.array.materialColorNames);
String randomMaterialColorName = materialColors[new Random().nextInt(
    materialColorNames.length)];

现在,由于您的状态栏颜色以 's' 结尾,您可以简单地执行此操作而不是整个 switch-case:

int randomStatusBarColorId = getResources().getIdentifier(
    randomMaterialColorName + "s", "color", getPackageName());
windows.setStatusBarColor(getResources().getColor(randomStatusBarColorId));