如何设置PreferenceActivity(R.xml.preferences)从SharedPreferences动态加载它的值?

问题描述:

我有一个扩展PreferenceActivity这样的MyPreferenceActivity:如何设置PreferenceActivity(R.xml.preferences)从SharedPreferences动态加载它的值?

public class MyPreferenceActivity extends PreferenceActivity{ 


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

} 

我也有R.xml.preferences由个人偏好类依赖于定制共享偏好...用于例如

的preferences.xml有

  <!--EditTextPreference--> 
      <com.myapp.preferences.PrimaryNumberPreference 
       android:key="PREFS_PRIMARY_NUMBER" 
       android:title="@string/primary_number_preference_title" 
       android:summary="@string/primary_number_preference_summary" 
       android:dialogTitle="@string/primary_number_preference_dialog_title" 
        android:dialogMessage="@string/primary_number_preference_dialog_message" 
      /> 

PrimaryNumberPreference.java:

public class PrimaryNumberPreference extends EditTextPreference { 

Context ctx = null; 

public PrimaryNumberPreference(Context context) { 
    super(context); 
    this.ctx = context; 
} 

public PrimaryNumberPreference(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    this.ctx = context; 
} 

public PrimaryNumberPreference(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    this.ctx = context; 

} 

@Override 
protected void onDialogClosed(boolean positiveResult) { 
    super.onDialogClosed(positiveResult); 
    if (positiveResult){  
     customPreferenceibrary.setPrefsPrimaryNumber(getText()); 
    } 
} 

} 

行,所以一切似乎要到位。现在我想要的是每次PreferenceActivity被加载时,它应该获取当前的共享首选项值,这些值存储在它们各自的密钥中,并预先填充PreferenceActivity的元素...

例如:当我的PrimaryNumber共享首选项设置为1234应用程序已安装。

MyPreferenceActivity.PrimaryNumberPreference.Val = getSharedPreferences(prefsPrimaryNumber)

:现在,如果我去MyPreferenceActivity和浏览PrimaryNumber EditTextPreference,文本框应该由1234

东西(伪代码)等预填充我怎样才能做到这一点?

编辑

请让我知道,如果这个问题不清楚,需要更好的explanantion。我相信答案是在android中非常标准的一个简单的实现。所有的PreferenceActivity元素都会从当前存储的SharedPreferences中选择要显示的当前值,对吧?

我在@Mel提供的建议帮助下找到了答案,而且非常简单。

在扩展相应PreferenceActivity元素的类中(如下所示),只需在该首选元素类的构造函数中添加this.setValue即可。而已!

public class selectColorPreference extends ListPreference{ 

    Context ctx = null; 
    private String error = null; 
    private int prefsRemoteSMSAccess; 
    MyPreferencesLibrary myPreferencesLibrary; 

    public selectColorPreference(Context context) { 
     super(context); 
     this.ctx = context; 

     myPreferencesLibrary = new MyPreferencesLibrary(ctx); 
     this.setValue(myPreferencesLibrary.getSharedPreferenceValueForColor()); 

    } 
} 

我想我看到两个潜在的问题:

问题一

如果你有一个自定义的偏好,如您需要手动保存偏好对话框关闭时PrimaryNumberPreference.java。这是你在做什么customPreferenceibrary.setPrefsPrimaryNumber(getText()); ??

如果他们没有在这个功能提交,那么我认为他们需要。(或者在onDialogClosed致力于别的地方)

问题,有两种

假设你commiting偏好在setPrefsPrimaryNumber,我觉得setPrefsPrimaryNumber需要接收两个paramenters,

  1. 偏好名称
  2. 实际值

我不认为这是只需要把键名在XML设置(安卓键=“PREFS_PRIMARY_NUMBER是不够的)

希望这有助于。

+0

是的,我通过覆盖onDialogClosed()为所有首选项保存首选项。有更好的选择吗?我选择这种方式是因为我希望使用自定义共享首选项将代码模块化为一个包含大量库类的大型项目。 Thnx为您提供帮助! – 2012-04-11 12:38:43

+0

我不知道设计的优点和缺点,但只要你承诺它应该工作的偏好。我认为你的问题必须是第二个问题(问题二在我的答案中)。如果只有一个参数,setPrefsPrimaryNumber如何知道提交哪些偏好? – Mel 2012-04-11 12:42:46

+0

这根本不是问题。每个SetPrefs对应一个特定的共享参数... setPrefsPrimaryNumber更新Primary_Number_Preference。 setPrefsSecondaryNumber等等。这些都是偏好库类中的公共方法!那么,主要的问题是如何在PreferenceActivity中显示当前的共享偏好值...例如:我们可以说共享首选项中的prim数是1234。现在,当我打开PreferenceActivity并单击主号码时,EditText应预填充“1234”。怎么做?得到它了? – 2012-04-11 12:48:32