在Android 3.0+上设置首选项的初始摘要

时间:2013-03-11 23:51:06

标签: android settings android-preferences

在下一个代码中有两个findpreference(key),第一个在onCreate()中,它返回null,但第二个正确返回首选项。我需要第一个能够很好地初始化首选项摘要。我花了很多时间尝试不同的方式,阅读文档和谷歌搜索,但我找不到方法,请帮忙。

public class Settings30Activity extends PreferenceActivity implements OnSharedPreferenceChangeListener {

    protected SettingsFragment settingsFragment;

    @SuppressLint("NewApi")
    @TargetApi(11)
    public static class SettingsFragment extends PreferenceFragment {
       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          addPreferencesFromResource(R.xml.preferences);            
       }            
     }

    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       settingsFragment = new SettingsFragment();    

   //findPreference 1 (returns null):        
       Preference stylePref=settingsFragment.findPreference("pref_style"); 
       stylePref.setSummary(sharedPreferences.getString(key, ""));

    }

   public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {     
    if (key.equals("pref_style")) {
    //findPreference 2(returns the preference ok):
        Preference stylePref=settingsFragment.findPreference("pref_style");
        stylePref.setSummary(sharedPreferences.getString(key, ""));            
    }
}

}

在调试时,我可以在变量中看到对象settingsFragment / mPreferenceManager在活动生命周期中是如何为空,直到调用onSharedPreferenceChanged(),然后settingsFragment / mPreferenceManager / mSharedPreferences获得sharedPrefereces和findpreference()效果很好。但我不知道怎么做才能在onSharedPreferenceChanged()之外工作。

2 个答案:

答案 0 :(得分:1)

它会返回null,因为您的第一个key来电中nullfindPreference(key)

在第二个电话中,key作为参数传递给onSharedPreferenceChanged(),这就是它在那里工作的原因。

当您正在寻找名为“pref_style”的键时,您可以为整个班级定义该名称(例如static final String PREF_STYLE_KEY = "pref_style"),然后在第一次通话中调用findPreference(PREF_STYLE_KEY)并{{1}在你的key.equals(PREF_STYLE_KEY)陈述中。

答案 1 :(得分:1)

这是我的最终代码,以防其他人需要它,它运作良好:

public class Settings30Activity extends PreferenceActivity implements 
    On SharedPreferenceChangeListener {

     protected SettingsFragment settingsFragment;    


 @SuppressLint("NewApi")
 @TargetApi(11)
 public static class SettingsFragment extends PreferenceFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);          
        setSummaries();
    }        

    @SuppressLint("NewApi")
    public void setSummaries(){
        final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ;

        //Pref1
        Preference stylePref = findPreference("pref_style");
        stylePref.setSummary(sh.getString("pref_style", ""));

        //here the other preferences..
     }  
}//End fragment

 @SuppressLint("NewApi")
 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    settingsFragment = new SettingsFragment(); 
    getFragmentManager().beginTransaction()
            .replace(android.R.id.content, settingsFragment)
            .commit();
 }

 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {       

    if (key.equals("pref_style")) {
        Preference pref = settingsFragment.findPreference(key);
        // Set summary to be the user-description for the selected value
        pref.setSummary(sharedPreferences.getString(key, ""));            
    }
    //here the others preferences
  }
}