我正在尝试在运行时通过选项菜单项单击来更改应用程序主题,但是它不起作用,并且我的应用程序一直崩溃。重新解决此错误的正确方法是什么? 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
)
}
我没有看到任何对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的任何内容都使用不同的键。