1

因此,我必须在我正在构建的这个应用程序中使用调色板 API 来动态更改状态栏颜色,并且当我传递值时,我得到了更改应用程序状态栏颜色的方法,并出现java.lang.IllegalArgumentException:未知颜色

无论通过在数字前面添加需要“#”并将其作为字符串传递,我都正确格式化它,但应用程序仍然崩溃。

这是我用来做的代码片段。

        binding.viewpagerMain.registerOnPageChangeCallback(
            object: ViewPager2.OnPageChangeCallback(){
                override fun onPageSelected(position: Int) {
                    var headerImage : Int? = null

                    when(position){
                        0 -> headerImage = R.drawable.character
                        1 -> headerImage = R.drawable.planets
                        2 -> headerImage = R.drawable.films
                        3 -> headerImage = R.drawable.species
                        4 -> headerImage = R.drawable.vehicles
                        5 -> headerImage = R.drawable.starships
                    }

                    if (headerImage != null) {
                        imageview_main.setImageResource(headerImage)
                        val bitmap = BitmapFactory.decodeResource(resources, headerImage)
                        Palette.from(bitmap).generate {

                            @SuppressLint("ResourceAsColor")
                            val paletteColor: Int? = it?.getDarkVibrantColor(R.color.colorPrimaryDark)
                            Log.e("MainFragment", "#${paletteColor}")
                            (activity as MainActivity).updateStatusBarColor("#${paletteColor.toString()}")
                        }
                    }
                }
            }
        )

这是我运行的活动功能

    open fun updateStatusBarColor(color: String?) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            val window: Window = window
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
            window.statusBarColor = Color.parseColor(color)
        }
    }

添加了一个日志调用以了解输出是什么,我得到的值是负数

#2131034159
#-14678008
#-15191992
#-7325688

我不知道为什么这些值是负数,或者如果可以,我假设它们在十六进制值的位置并传递了它们,但它们仍然不起作用。

4

1 回答 1

3

颜色在 Android 上存储为 32 位整数,如Color ints文档中所述。如果最高有效位为 1,则该值被解释为负数,因为整数是有符号的。但是,在颜色的上下文中将其解释为已签名是没有意义的。事实上,整数可以取的所有值都是有效的颜色。

这是修复日志记录语句的两种解决方案:

  • "#${(paletteColor.toLong() and 0xFFFFFFFF).toString(16)}". 增加颜色的位宽并应用 32 位掩码,因此最高有效位为 0,值显示为正数。
  • "#${paletteColor.toUInt().toString(16)}". 使用无符号整数。(需要在 Kotlin 中具有实验性的无符号数字编译器选项)

我更喜欢第一个。

对于实际更改颜色,我不知道您是否意识到您在这里:您得到一个颜色 int,将其转换为字符串,然后将其解析回原始 int!为什么要添加不必要的步骤?只需使用从返回的 intgetDarkVibrantColor来更新window.statusBarColor

于 2020-06-08T13:55:32.000 回答