在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!