安卓:程序化设置偏好设置

44

我有一个带有设置项的小应用程序。在这个类中,我已将onPreferenceClick设置为从GPS获取坐标。当监听器返回时,我的希望是自动设置经纬度文本编辑框。我尝试了所有可用的源代码示例,但没有成功:

public void onLocationChanged(Location l) {
  Log.d("H","Location Received: "+l.toString());
  prefLocation.setSummary(l.toString());
  SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
  SharedPreferences.Editor editor1 = settings.edit();
  editor1.putString("posLat","xxx");
  editor1.commit();
}
当我点击PreferenceScreen时,执行此代码并且位置侦听器返回时,“posLat”键的EditTextPreference仍显示旧值。我正在为弄清楚问题而疯狂!我的prefs.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:key="My_Shared_Preferences">
    <PreferenceCategory
        android:title="Your Location">
        <PreferenceScreen
            android:title="Find Location..."
            android:key="location"
            android:summary="Click here to read your location automatically"/>
        <EditTextPreference
            android:title="Latitude" 
            android:key="posLat" />
        <EditTextPreference
            android:title="Longtitude" 
            android:key="posLong" />
        <EditTextPreference
            android:title="Altitude" 
            android:key="posAlt" />
    </PreferenceCategory>
</PreferenceScreen>

或者,也许有更好的方法来存储应用程序的位置值?我不想让用户手动输入坐标,但是我也不想使用保存和加载文本文件的设置,这似乎太粗糙了。

3个回答

38

我也遇到了类似的问题,我的解决方法是使用默认的共享首选项而不是手动创建具有给定名称的首选项。

将对SharedPreferences的引用从这个改为:

SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);

变成这样:

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);

并查看是否有任何不同。


13
兄弟,我希望能请你喝杯咖啡。非常感谢! - Hein du Plessis
12
不客气 :) 我也花了一些时间来解决这个问题,能理解你的感受。我会喝杯咖啡假装是你请的 ;) - Eric Nordvik
1
即便如此,摘要仍未更新。为什么? - Sundaravel
@Sundaravel,我遇到了相同的问题,摘要没有更新。我通过在commit()之后立即调用这个方法来解决了这个问题:// 立即使用首选项的当前值触发监听器。 sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager.getDefaultSharedPreferences(preference.getContext()).getString(preference.getKey(), "")); - undefined

16

看起来实际上发生了改变(见12

现在的做法是

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(PREF_NAME, YOUR_VALUE);
editor.commit();

0
“旧值”是什么?根据您发布的代码,似乎唯一存储在您的首选项中的是字符串“xxx”,您需要将其替换为表示putString()方法内部位置的字符串。

旧值是我在运行应用程序时手动输入到首选项屏幕中的任意数字。我希望这个值改变为xxx。我不清楚你所说的“用表示putString()方法内部位置的字符串替换它”的意思。谢谢回复。 - Hein du Plessis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接