首页 > 解决方案 > Fragment 中的 Android 共享首选项不起作用 - Kotlin

问题描述

我已经花了几个小时研究并试图找到解决方案,但还是有条不紊的。所以这是我关于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?我没有任何线索。

谢谢您的帮助。

标签: androidandroid-fragmentsandroid-activitykotlin

解决方案


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

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

而不是调用此函数:

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

我们需要调用这个函数

val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)

然后其余的工作。


推荐阅读