以编程方式更改列表首选项选择

时间:2014-09-15 14:45:40

标签: android android-preferences

我一直在努力寻找如何在没有用户实际操作的情况下更改列表首选项中的选择。我需要做的是有一个方法随机选择列表首选项中的一个选项。这只有在"随机化"复选框已选中。那部分我可以正常工作,但实际的随机化是不起作用的。这就是我所拥有的:

以下是列表首选项

<ListPreference
            android:key="location_preference"
            android:title="@string/location"
            android:summary="@string/location_summary"
            android:entries="@array/locations"
            android:entryValues="@array/locationValues"
            android:defaultValue="Canyon"
            android:dialogTitle="@string/location" />

这是我提出的随机选择

的方法
protected static void setRandomLocation(Context context){
    SharedPreferences preferences = getPreferences(context);
    Set<String> locs = preferences.getStringSet("location_preference", null);
    int idx = new Random().nextInt(locs.toArray().length);
    String random = (String) (locs.toArray()[idx]);
    preferences.edit().putString("location_preference", random);
    preferences.edit().commit();
}
private static SharedPreferences getPreferences(Context context) {
    return PreferenceManager.getDefaultSharedPreferences(context);
}

我做错了什么/我应该怎么做?

编辑:所以我尝试了以下尝试修复它,但它没有用。

protected static void setRandomLocation(Context context){
    Resources res = context.getResources();
    SharedPreferences preferences = getPreferences(context);
    String curr = preferences.getString("location_preference", null);
    int idx = new Random().nextInt(res.getStringArray(R.array.locationValues).length);
    String random = (String) (res.getStringArray(R.array.locationValues)[idx]);
    if(random == curr)
        setRandomLocation(context);
    preferences.edit().putString("location_preference", random);
    preferences.edit().commit();
}

1 个答案:

答案 0 :(得分:0)

 Set<String> locs = preferences.getStringSet("location_preference", null);

那里没有android:key="location_preference"的字符串集。只有一个字符串:

    String location = preferences.getString("location_preference", null;

您必须从预定义的数组android:entryValues="@array/locationValues"获取所有字符串并从中随机取出一个并将其保存到&#34; location_preference&#34;。