2010-09-16 37 views
0

我正在尝试为我的应用程序创建一个设置部分。我有一个RES/XML/settings.xml中:我的偏好不“粘”

<?xml version="1.0" encoding="utf-8"?> 
    <PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <ListPreference 
    android:key="numberOfYears" 
    android:title="Number of Years to Read the Bible" 
    android:summary="How many years would you like to take to read through the reading plan?" 
    android:entries="@array/numberOfYears" 
    android:entryValues="@array/numberOfYears" 
    android:dialogTitle="How Many Years?" 
    /> 
    <CheckBoxPreference android:key="ignoreDates" 
    android:title="Ignore Dates" 
    android:summary="Would you like to use the dates in the plan?" 
    /> 
</PreferenceScreen> 

我有一类称为首延伸PreferenceActivity并包含以下内容:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.settings); 
} 

我不知道,如果这是必需的,但我还增加了以下我的主要活动:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    menu.add(Menu.NONE, PREFS_MENU, Menu.NONE, "Preferences"); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    Log.d(TAG, "Menu Item: " + item.getItemId()); 
    switch (item.getItemId()) { 
    case PREFS_MENU : 
     startActivity(new Intent(this, Preferences.class)); 
     return true; 
    } 
    return false; 
} 

这似乎是工作中,我得到一个“首选项”菜单,选中它时,启动我的喜好。但是,当我选择任何值似乎不坚持。我的理解是,android:key足以让系统在默认的共享首选项中设置所选的值 - 是不是这种情况?

我错过了什么?

+0

“当我选择什么价值观似乎并没有坚持” - 什么是你的这个定义?这是一个可用的示例项目:http://github.com/commonsguy/cw-android/tree/master/Prefs/Dialogs/ – CommonsWare 2010-09-16 10:35:22

+0

如果我进入并设置首选项,请按回,然后再次进入,然后偏好未设置。这就是我不坚持的意思。不过我会看看你的项目。谢谢。 – 2010-09-16 11:02:55

+0

有趣的是,如果我使用adb去查看共享首选项 - 值被设置。那么为什么在设置偏好时不显示呢? – 2010-09-16 11:09:38

回答

0

不知道我是否正确地做了这件事,我很想有投入或其他最好或更好的做法。

我做了我PreferenceActivity类也实现OnSharedPreferenceChangeListener,并实施这样的这些方法:

@Override 
protected void onResume() { 
    super.onResume(); 
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
} 

public void onSharedPreferenceChanged(SharedPreferences arg0, String arg1) { 
    // TODO Auto-generated method stub 
    Preference pref = findPreference(arg1); 
    if (pref instanceof ListPreference) { 
     ListPreference listPref = (ListPreference)pref; 
     pref.setSummary(listPref.getEntry()); 
    } 
    else { 
     pref.setSummary(arg0.getString(arg1, pref.getSummary().toString())); 
    } 
}