在下一个代码中有两个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()
之外工作。
答案 0 :(得分:1)
它会返回null
,因为您的第一个key
来电中null
为findPreference(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
}
}