2013-03-11 62 views
1

在下一个代码中有两个findpreference(key),第一个在onCreate(),它返回null,但第二个返回正确的偏好。我需要第一个很好的工作来初始化首选项摘要。我花了很多时间尝试不同的方式,阅读文档和使用谷歌搜索,但我没有找到方法,请帮助。设置Android 3.0+的偏好设置的初始摘要

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()之外。

回答

1

它返回null因为您的keynull在您的第一个findPreference(key)调用。

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

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

+0

对不起,我的代码我是直接找“pref_style”在这两种情况下,而不是主要的,所以这是不事情。谢谢您的回答!在debbuging时,我可以在变量中看到对象settingsFragment/mPreferenceManager在活动生命周期中是如何为空的,直到刚刚调用onSharedPreferenceChanged()时,settingsFragment/mPreferenceManager/mSharedPreferences获得了sharedPrefereces和findpreference()的效果。但是我不知道该如何处理它在SharedPreferenceChanged()之外的作品。 – user23 2013-03-12 09:21:55

+1

这很奇怪,因为'mPreferenceManager'是在'PreferenceFragment'的'onCreate()'方法中初始化的。你是否尝试在'settingsFragment'的'onCreate()'中设置总结(然后调试)?顺便说一句,你的第一个电话之后的'sharedPreferences'从哪里来? – saschoar 2013-03-12 10:41:18

+0

是的!在settings的片段onCreate()中设置sumar而不是在Activity的onCreate()中是解决方案。现在完美!谢谢saschoar! – user23 2013-03-12 17:16:21

1

Here's我万一别人最后的代码需要它,它工作得很好:

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