Несоответствие типов при смене темы из меню настроек - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь изменить тему приложения во время выполнения, щелкнув по пункту меню параметров, но она не работает, и мое приложение продолжает падать. Как правильно исправить эту ошибку? 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
        )
}

Ответы [ 2 ]

2 голосов
/ 14 марта 2020

Вы устанавливаете значение prefTheme как Int в setNewTheme () и получаете его как Boolean в shouldUseDarkTheme (). Для решения вашей проблемы сохраните один int для стиля и один другой boolean для проверки, чтобы применить темную тему или нет.

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

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}

    if (newTheme== R.style.DarkTheme){
        PreferenceManager.getDefaultSharedPreferences(this)
            .edit()
            .putBoolean(applydarktheme, true)
            .apply()
    }else{
        PreferenceManager.getDefaultSharedPreferences(this)
            .edit()
            .putBoolean(applydarktheme, false)
            .apply()
    }


    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(
        applydarktheme,
        false
    )

}

0 голосов
/ 14 марта 2020

Я не вижу кода, который записывает логическое значение для SharedPreferences, но у вас есть код, который читает логическое значение:

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)
}

Вам нужно будет go через ваше приложение и убедиться, что все, что читает / записывает логическое значение, и все, что читает / пишет int, используя разные ключи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...