【问题标题】:kotlin - applying changes from sharedPreferences instantlykotlin - 立即应用来自 sharedPreferences 的更改
【发布时间】:2021-11-05 05:49:10
【问题描述】:

在我的应用程序中,我有一个设置片段,用户可以设置数据,例如他们想要的小数位数。目前,使用共享首选项,应用程序在重新打开应用程序时成功记住上次输入的数据。但是,更改仅在用户重新打开应用时应用,而不是在首次应用时应用。

以下代码位于MainActivity.kt中:

val sp = PreferenceManager.getDefaultSharedPreferences(this.applicationContext)

 val decimalPlaces = sp.getString("decimalPlaces", "")


        sharedViewModel.form  = DecimalFormat("#,###.##")

        when(decimalPlaces!!.toInt()){
            0 -> sharedViewModel.form  = DecimalFormat("#,###")
            1 -> sharedViewModel.form = DecimalFormat("#,###.#")
            2 -> sharedViewModel.form  = DecimalFormat("#,###.##")
            3 -> sharedViewModel.form = DecimalFormat("#,###.###")
            4 -> sharedViewModel.form = DecimalFormat("#,###.####")
        }

在研究解决方案以在应用程序中应用更改时,我遇到了以下问题:

Commit() and apply() 与其他类似方法一起,但是我无法成功实现这些方法。

有人对如何在不退出应用程序的情况下应用更改有什么建议吗?

【问题讨论】:

  • 你在哪里设置字符串?
  • 字符串是使用位于 settingsFragment 中的列表首选项设置的,取决于单击列表中的哪个项目,返回位于数组中的相应值
  • 一旦他们从 fragment 设置值,你刷新 Mainactivity 获取字符串了吗?
  • 我目前的代码位于名为 loadsettings() 的函数中,我在 MainActivity.kt 中调用此函数,我不确定如何刷新 MainActivity
  • 在fragment中创建接口,在activity中实现。当片段中的某些事情发生变化时,调用将触发主要活动的接口。那里刷新sharedpreference

标签: android kotlin sharedpreferences


【解决方案1】:

更改会立即应用,但您似乎只在应用启动时阅读共享首选项。为了根据更改的小数位值更​​改您的值,您需要通知您的活动小数位值已更改,并且它应该相应地更新视图。

实现此目的的一种方法是使用LiveData 对象并在您保存到共享首选项时将更改后的小数位值发布到它。

在SharedViewModel 中声明一个 LiveData 对象

val decimalPlaces : MutableLiveData<String> = MutableLiveData()

当您为共享首选项保存价值时,将此LiveData 更新为

fun saveToSharedPreferences(newDecimalPlacesValue: String){
    // Your code that saves to shared preferences
    decimalPlaces.postValue(newDecimalPlacesValue)
}

最后observe 这个LiveData 在你的活动中并更新用户界面

override fun onCreate(){
    ...
    sharedViewModel.decimalPlaces.observe(this, Observe{
        if(!it.isNullOrEmpty()){
            when(it.toInt()){
            0 -> sharedViewModel.form  = DecimalFormat("#,###")
            1 -> sharedViewModel.form = DecimalFormat("#,###.#")
            2 -> sharedViewModel.form  = DecimalFormat("#,###.##")
            3 -> sharedViewModel.form = DecimalFormat("#,###.###")
            4 -> sharedViewModel.form = DecimalFormat("#,###.####")
        }
        }
    })
}

【讨论】:

  • 观察liveData时,我应该把这段代码放在哪里?还有
  • 类型不匹配:推断类型为 DecimalFormat 但 MutableLiveData 应出现在 when 为 sharedViewModel.form 设置新值时的语句中
  • 您需要将小数位值发布到LiveData,不要发布DecimalFormat
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
相关资源
最近更新 更多