【问题标题】:How to save switch setting in Android using Kotlin如何使用 Kotlin 在 Android 中保存开关设置
【发布时间】:2019-02-14 22:57:12
【问题描述】:

我需要使用 Kotlin 将一个开关(实际上是 6 个开关)的位置保存为 Android 用户首选项的一部分。

我已经用 Java 编写了代码,没有任何问题,但是这段代码需要在 Kotlin 中。 我正在考虑像在 Java 中一样使用共享首选项,并已成功生成代码来保存一个开关的状态。但是,当我编写代码来添加第二个开关时,第一个开关会控制其他开关,并且它们的状态与第一个开关相同。此外,所有后续切换都将重现相同。 我已经尝试过 Kotlin.org 代码转换器/翻译器,但这会产生一堆乱码,我必须在编译之前清理它们,然后发现翻译后的代码可能不完整。

    private fun onSwitch() {

    val sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE)
    val editor = sharedPreferences.edit()


    push_switch1.isChecked = sharedPreferences.getBoolean(PREF_SWITCH, false)
    push_switch1.setOnCheckedChangeListener { _, isChecked ->
        if (isChecked){
            editor.putBoolean(PREF_SWITCH, push_switch1.isChecked)
            editor.putBoolean(PREF_SWITCH, true)
            Toast.makeText(this@MainActivity, "Push Notification ON", Toast.LENGTH_SHORT).show()
        } else {
            editor.putBoolean(PREF_SWITCH, false)
            Toast.makeText(this@MainActivity, "Push Notification Off", Toast.LENGTH_SHORT).show()
        }
        //editor.apply()
    }
    email_switch1.isChecked = sharedPreferences.getBoolean(PREF_SWITCH, false)
    email_switch1.setOnCheckedChangeListener { _, isChecked ->
        if (isChecked){
            editor.putBoolean(PREF_SWITCH, email_switch1.isChecked)
            editor.putBoolean(PREF_SWITCH, true)
            Toast.makeText(this@MainActivity, "Email Notification ON", Toast.LENGTH_SHORT).show()
        }else{
            editor.putBoolean(PREF_SWITCH, false)
            Toast.makeText(this@MainActivity, "Email Notification OFF", Toast.LENGTH_SHORT).show()
        }
        //editor.apply()
    }
    editor.apply()

这是一个首选项页面,每个开/关开关都会打开或关闭特定的用户首选项。此外,开关状态需要保持不变以保留用户的设置。

【问题讨论】:

  • 您必须将更改应用到每个侦听器内的编辑器。在 Java 中也是如此。
  • 您应该根据自己的喜好使用不同的键。无论开关如何,您始终在上面的代码中使用相同的 PREF_SWITCH 键。每个开关都应与给定的键相关联。
  • 仅供参考,您不需要在线代码转换器,如果您将 Java 代码粘贴到 .kt 文件中,Android Studio 和 Intellij IDEA 会自动将其转换为 Kotlin。
  • @Egor 谢谢你。
  • @Wang 是的,你是对的!我非常着迷于确保 Kotlin 代码是正确的,以至于我没有更改,或者为其他开关添加额外的键。感谢您的回复。

标签: android kotlin sharedpreferences uiswitch


【解决方案1】:

您的交换机 push_switch1 和 email_switch1 都使用相同的 Preference KEY,即 PREF_SWITCH。

您需要为每个交换机添加唯一的 Preference KEY。 添加 PREF_SWITCH_PUSH 和 PREF_SWITCH_EMAIL 首选项。 那就试试这个……

private fun onSwitch() {

    val sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE)
    val editor = sharedPreferences.edit()


    push_switch1.isChecked = sharedPreferences.getBoolean(PREF_SWITCH_PUSH, false)
    push_switch1.setOnCheckedChangeListener { _, isChecked ->
        if (isChecked){
            editor.putBoolean(PREF_SWITCH_PUSH, true)
            Toast.makeText(this@MainActivity, "Push Notification ON", Toast.LENGTH_SHORT).show()
        } else {
            editor.putBoolean(PREF_SWITCH_PUSH, false)
            Toast.makeText(this@MainActivity, "Push Notification Off", Toast.LENGTH_SHORT).show()
        }
        editor.apply()
    }
    email_switch1.isChecked = sharedPreferences.getBoolean(PREF_SWITCH_EMAIL, false)
    email_switch1.setOnCheckedChangeListener { _, isChecked ->
        if (isChecked){
            editor.putBoolean(PREF_SWITCH_EMAIL, true)
            Toast.makeText(this@MainActivity, "Email Notification ON", Toast.LENGTH_SHORT).show()
        }else{
            editor.putBoolean(PREF_SWITCH_EMAIL, false)
            Toast.makeText(this@MainActivity, "Email Notification OFF", Toast.LENGTH_SHORT).show()
        }
        editor.apply()
    }
}

【讨论】:

  • 感谢您的观看。在我发布这个问题大约一个小时后,我意识到我做了什么。我完全沉浸在 Kotlin 代码中,没有考虑为额外的开关更改或添加额外的键。
猜你喜欢
  • 2020-08-23
  • 2017-11-20
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2021-06-12
  • 2021-08-11
  • 1970-01-01
相关资源
最近更新 更多