Fragment内的Android共享首选项不起作用-Kotlin

时间:2019-02-18 09:55:46

标签: android android-fragments android-activity 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()

这是由google预先配置的,我假设这有点复杂。但是我不知道也许我错了。

其他问题

如果您还想在这里帮助我,那么这个问题将排在最前面。 我要在OnPreferenceTreeClick内获取最后的已知位置。 这已经在我的代码中起作用了。唯一的问题是,我似乎无法将fusedLocationClient放在类中。 它在那里不起作用。

因为在此通话中:

 fusedLocationClient = LocationServices.getFusedLocationProviderClient(activity)

活动返回FragmentActivity吗?但是它需要活动。

那么我如何在FragmentActivity中获取我的SettingsActivity?

也许与companion object有关系? 我不知道。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

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

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

代替调用此函数:

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

我们需要调用此函数

val sharedPref = PreferenceManager.getDefaultSharedPreferences(context)

然后其余的工作。

答案 1 :(得分:0)

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

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

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