[从选项菜单更改主题时类型不匹配

问题描述 投票:1回答:2

我正在尝试在运行时通过选项菜单项单击来更改应用程序主题,但是它不起作用,并且我的应用程序一直崩溃。重新解决此错误的正确方法是什么? Android Studio不会提供任何建议,更不要说有用的建议。

java.lang.Boolean无法转换为java.lang.Integer

class MainActivity : AppCompatActivity() {
    private val prefTheme = "preference_DarkTheme"

    override fun onCreate(savedInstanceState: Bundle?) {
        useDarkTheme = shouldUseDarkTheme()
        setTheme(
            if (useDarkTheme) R.style.DarkTheme
            else R.style.LightTheme
        )

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onStart() {
        super.onStart()

        if (useDarkTheme != shouldUseDarkTheme()) recreate()
    }


    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }


    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_changeTheme -> {
                switchTheme()
                restartActivity()

                Toast.makeText(this, "Test", Toast.LENGTH_SHORT).show()
                true
            }
            else -> { super.onOptionsItemSelected(item) }
        }
    }

    private fun getSavedTheme(): Int {
        return PreferenceManager.getDefaultSharedPreferences(this)
            .getInt(prefTheme, R.style.LightTheme)
    }

    private fun switchTheme() {
        val newTheme: Int =
            if (getSavedTheme() == R.style.LightTheme) R.style.DarkTheme else R.style.LightTheme
        PreferenceManager.getDefaultSharedPreferences(this)
            .edit()
            .putInt(prefTheme, newTheme)
            .apply()
    }

    private fun restartActivity() {
        startActivity(
            Intent(this, MainActivity::class.java)
        )
        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
        finish()
    }

    private fun shouldUseDarkTheme(): Boolean =
        PreferenceManager.getDefaultSharedPreferences(this).getBoolean(
            "preference_DarkTheme",
            false
        )
}
android kotlin android-theme android-preferences android-optionsmenu
2个回答
0
投票

我没有看到任何对SharedPreferences进行布尔化的代码,但是您确实对reads一个布尔值进行了编码:

private fun shouldUseDarkTheme(): Boolean = PreferenceManager.getDefaultSharedPreferences(this).getBoolean( "preference_DarkTheme", false )

这使我假设,在过去的某个时候,您已经使用该键编写了一个布尔值的代码。

现在您有读取Int值的代码,但它使用的键与以前的布尔代码相同:

private val prefTheme = "preference_DarkTheme" private fun getSavedTheme(): Int { return PreferenceManager.getDefaultSharedPreferences(this) .getInt(prefTheme, R.style.LightTheme) }
您必须浏览您的应用程序,并确保读取/写入布尔值的任何内容和读取/写入int的任何内容都使用不同的键。

0
投票
您在setNewTheme()中将prefTheme的值设置为Int,并在shouldUseDarkTheme()中将其作为布尔值获取。为解决您的问题,将一个int存储为样式,将另一个布尔存储为检查是否应用深色主题。
© www.soinside.com 2019 - 2024. All rights reserved.