在Android 3.0+;

在Android 3.0+;,android,settings,android-preferences,Android,Settings,Android Preferences,在下一个代码中有两个findReference(key),第一个在onCreate()中,它返回null,但第二个正确返回首选项。我需要第一个可以很好地初始化首选项摘要。我花了很多时间尝试不同的方法,阅读文档和谷歌搜索,但我还没有找到方法,请帮忙 public class Settings30Activity extends PreferenceActivity implements OnSharedPreferenceChangeListener { protected Settin

在下一个代码中有两个
findReference(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, ""));            
    }
}
}


在调试期间,我可以在变量中看到对象设置片段/mPreferenceManager在整个活动生命周期中是如何为null的,直到刚刚调用
onSharedPreferenceChanged()
,然后设置片段/mPreferenceManager/mSharedPreferences获得SharedPreferences并且
findpreference()
工作正常。但是我不知道该怎么做,因为它在sharedpreferencechanged()之外工作。

它返回
null
,因为您的
键在第一次
findReference(key)
调用中是
null

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


在查找名为“pref_style”的键时,您可以为整个类定义该名称(例如
静态最终字符串pref_style_key=“pref_style”
),然后在第一次调用中调用
FindReference(pref_style_key)
,在
if()中调用
语句。

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

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
  }
}

抱歉,在我的代码中,我在两种情况下都直接寻找“pref_样式”,而不是键,所以这不是问题所在。谢谢你的回答!在清除bug时,我可以在变量中看到对象设置Fragment/mPreferenceManager在整个活动生命周期中是如何为null的,直到刚刚调用onSharedPreferenceChanged(),然后设置Fragment/mPreferenceManager/MSSharedPreferences获得SharedPreferences,findpreference()工作正常。但我不知道如何在共享首选项更改()之外工作。这很奇怪,因为
mPreferenceManager
是在
PreferenceFragment
onCreate()方法中初始化的。您是否尝试在
settingsFragment
onCreate()
中最初设置摘要(然后调试)?顺便问一下,您第一次打电话后的
共享参考从哪里来?是的!解决方案是在settingsFragment的onCreate()中设置sumaries,而不是在Activity的onCreate()中设置sumaries。现在工作完美!谢谢saschoar!