0

我正在尝试以编程方式从 SharedPreferences 中删除列表视图中的一个选项。我在下面包含了简化的代码。

我已经阅读了大量类似的问题,但它似乎对我不起作用。我一定是误解了一个关键概念。请帮忙。

我尝试过使用 clear() 和 apply()。我也尝试过添加一行而不是全部删除但没有成功。

我想我可能误解了使用哪些键并尝试过替代键的概念,但似乎没有任何效果。

我的preferences.java

package il.preferences;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;

public class Preferences extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        SharedPreferences preferences = getSharedPreferences(
                "myKey", MODE_PRIVATE);
        preferences.edit().remove("1").commit();
    }
}

我的偏好.xml

 <?xml version="1.0" encoding="utf-8" standalone="no"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <PreferenceCategory android:title="Cat X" >
        <ListPreference
            android:defaultValue="1"
            android:entries="@array/myOptions"
            android:entryValues="@array/myValues"
            android:key="myKey"
            android:summary="Select an item"
            android:title="Choose" />
    </PreferenceCategory>

</PreferenceScreen>

我的strings.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<resources>
    <string-array name="myOptions">
        <item>A</item>
        <item>B</item>
        <item>C</item>
    </string-array>
    <string-array name="myValues">
        <item>1</item>
        <item>2</item>
        <item>3</item>
    </string-array>
</resources>
4

1 回答 1

0

我的问题是我错误地概念化了偏好框架。我将分享我的错误转弯以帮助任何其他迷路的新手。

我混淆了我在上面的preferences.xml中定义的PreferenceScreen和存储偏好的文件,可以在DDMS透视my.package.name_preferences.xml上看到-使用文件管理器-数据-数据-项目名称-shared_prefs查找并提取此文件

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="myKey">1</string>
</map>

然后我错误地继续尝试使用首选项编辑器来更改 PreferenceScreen

SharedPreferences preferences = getSharedPreferences("myKey", MODE_PRIVATE);
preferences.edit().remove("1").commit();

最终,我在 Google APIs com.example.android.apis.ApiDemos com/example/android/apis/preference 中找到了示例代码,其中包含我需要的所有排列,以便最终理解。

我最终的解决方案是结合使用 setPreferenceScreen(createPreferenceHierarchy()); addPreferencesFromResource(R.xml.preferences);

结合我的静态和动态偏好。我在下面添加了我的动态偏好的代码(感谢 Google)。我建议查看 google api 而不是尝试在线查找教程或使用书籍。

import java.util.List;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;

public class SetPreferenceActivityGB extends PreferenceActivity {
    private static final String LENGTH_DEFAULT = "4";
    private static final String LEVEL_DEFAULT = "level1";

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setPreferenceScreen(createPreferenceHierarchy());
        addPreferencesFromResource(R.xml.preferences);
    }


    private PreferenceScreen createPreferenceHierarchy() {
        PreferenceScreen root = getPreferenceManager().createPreferenceScreen(
                this);


        // Dialog based preferences
        PreferenceCategory dialogBasedPrefCat = new PreferenceCategory(this);
        root.addPreference(dialogBasedPrefCat);

        // List preference
        ListPreference listPref = new ListPreference(this);

// This is where I get my dynamic list of levels and use it as a character sequence to
// To make my list view dynamic.     
        List<String> myList ; 

        myList = Playsound.getAvailableLevels(); // Function which is Dynamic
        CharSequence[] cs = myList.toArray(new CharSequence[al.size()]);

        listPref.setEntries(cs);
        listPref.setEntryValues(cs);
        // listPref.setEntries(R.array.levels);
        // listPref.setEntryValues(R.array.levelsValues);
        listPref.setDialogTitle(R.string.level_title);
        listPref.setKey("level");
        listPref.setTitle(R.string.level_title);
        listPref.setValueIndex(0);
        listPref.setDefaultValue(LEVEL_DEFAULT);
        listPref.setSummary(R.string.level_summary);
        dialogBasedPrefCat.addPreference(listPref);

    }
}
于 2012-08-03T11:30:48.427 回答