1

在接下来的代码中有两个findpreference(key),第一个是 in 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()

4

2 回答 2

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
  }
}
于 2013-03-12T17:25:10.803 回答
1

它返回是null因为您在第一次通话中。keynullfindPreference(key)

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

当您正在寻找一个名为“pref_style”的键时,您可以为整个类定义该名称(例如static final String PREF_STYLE_KEY = "pref_style"),然后在您findPreference(PREF_STYLE_KEY)的第一个调用和语句中调用。key.equals(PREF_STYLE_KEY)if()

于 2013-03-12T00:31:43.167 回答