【问题标题】:Android Shared Preferences inside Fragment not working - KotlinFragment 中的 Android 共享首选项不起作用 - Kotlin
【发布时间】:2019-02-18 09:55:46
【问题描述】:

我已经花费了数小时研究并试图找到解决方案,但我坚持不懈。所以这是我关于stackoverflow的第一个问题。多年来,由于话题太多,我可以不用问自己的问题。

如果我做错了什么,请善待我。我会尽我所能提高提问的能力。

我的问题是,它不会存储或读取首选项中的数据。它说它们不存在。我从 google 获取了首选项屏幕的示例代码。里面有很多碎片。在其中一个片段中,我捕获了一个偏好点击,并想用它更改其他偏好之一的值。

跟着你找到我的代码。

我认为问题在于AlveolPreferencesFragment的onPreferenceTreeClick。

感谢您的所有帮助以及您在不知道您这样做之前给我的所有帮助:))

Alveol_Preferences XML

<androidx.preference.PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <PreferenceCategory
        app:title="@string/heart_alveol">

        <EditTextPreference
            app:key="latitude"
            app:dialogTitle="@string/latitude_summary"
            app:useSimpleSummaryProvider="true"
            app:title="@string/latitude"
            app:defaultValue="-34.0"/>

        <EditTextPreference
            app:key="longitude"
            app:dialogTitle="@string/longitude_summary"
            app:useSimpleSummaryProvider="true"
            app:title="@string/longitude"
            app:defaultValue="151.0"/>

        <Preference
            app:key="gpsheart"
            app:title="@string/gpsheart"
            app:summary="@string/gpsheart_summary"/>
    </PreferenceCategory>

</androidx.preference.PreferenceScreen>

类 AlveolPreferencesFragment

class AlveolPreferencesFragment : PreferenceFragmentCompat() {



        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {


            setPreferencesFromResource(R.xml.alveol_preferences, rootKey)
        }
        override fun onPreferenceTreeClick(preference: Preference): Boolean {

            return when (preference.key) {
                "gpsheart" -> {

                    var sharedPref : SharedPreferences? = activity?.getPreferences(Context.MODE_PRIVATE)
                    val editor = sharedPref?.edit()
                    editor?.putString("latitude", "Test").apply()


                    val text = sharedPref?.getString("longitude","Longitude doesn't exist")
                    val duration = Toast.LENGTH_SHORT

                    val toast = Toast.makeText(context, text, duration)
                    toast.show()



                    true
                }
                else -> {
                    super.onPreferenceTreeClick(preference)
                }
            }

        }

AlveolPreferencesFragment 类位于此内部 class SettingsActivity : AppCompatActivity()

这是由谷歌预先配置的,我认为这有点复杂。但我不知道也许我错了。

其他问题

如果您还想在这里帮助我,这个问题就排在首位。 在OnPreferenceTreeClick 内,我想获取最后一个已知位置。 这已经适用于我的代码。唯一的问题是,我似乎无法将fusedLocationClient 放在课堂上。 它不会在那里工作。

因为在这个调用中:

 fusedLocationClient = LocationServices.getFusedLocationProviderClient(activity)

activity返回FragmentActivity?但它需要Activity。

那么我怎样才能在这个 FragmentActivity 中获取我的 SettingsActivity?

也许是companion object? 我不知道。

感谢您的帮助。

【问题讨论】:

  • 融合位置你试过mFusedLocationClient = LocationServices.getFusedLocationProviderClient(activity!!.applicationContext)
  • 嘿,Tejas,就像一个魅力!谢谢!!在这个上也花了至少 3 个小时;)现在我得到了片段内的位置。我还不能投票给答案。但这是正确的解决方案。
  • 没有问题亚历克斯。你得到了更重要的解决方案。
  • 现在你能详细说明一下吗?您优先面临什么问题。 It says that they don't exist 是什么意思。您可以发布错误或其他内容吗?
  • 在 XML 中,我定义了键经度。在代码中,我尝试读取该值。但相反,它给了我默认值:“经度不存在”所以不知何故它无法访问 sharedPreferences。我在虚拟设备和普通安卓设备上进行了测试。 Android 调试器没有显示任何错误。

标签: android android-fragments android-activity kotlin


【解决方案1】:

经过几天的搜索,我终于自己找到了答案。 如果有人遇到同样的问题,我会在这里发布。

在德国,我们有一句谚语“Der Teufel steckt im Detail”;) 大致翻译为“魔鬼在细节中”

而不是调用这个函数:

var sharedPref : SharedPreferences? = Activity?.getPreferences(Context.MODE_PRIVATE)

我们需要调用这个函数

val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)

然后剩下的工作。

【讨论】:

    【解决方案2】:

    作为 2021 年 5 月的更新,PreferenceManager.getDefaultSharedPreferences 似乎已被弃用。

    下面的 Kotlin 代码可以工作,并在对话片段中进行了测试:

    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
    sharedPref?.edit()?.putInt(YOUR_SHARED_PREF_STRING_INDEX_VALUE, yourValueToStore)
    

    【讨论】:

      【解决方案3】:

      像这样在片段中创建一个实例:

      protected val defaultPreferences: SharedPreferences
              get() = PreferenceManager.getDefaultSharedPreferences(activity)

      在默认共享首选项中设置值

      defaultPreferences.edit {
                  putBoolean("clone_active", false)
              }

      获取默认共享偏好的值:

      val sharedPrefBooleanFromDefaultPref = defaultPreferences.getBoolean("clone_active", false)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多