【发布时间】:2013-01-23 06:21:06
【问题描述】:
我有一个非常简单的首选项设置,其中将PreferenceFragment 添加到Activity。 Activity 也是 OnSharedPreferenceChangeListener,因为我想在更新偏好时更新特定偏好的摘要。这是Activity:
public class PrefsActivity extends Activity implements OnSharedPreferenceChangeListener {
private static final String PREF_KEY = "key goes here";
private PrefsFragment pf;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pf = new PrefsFragment();
getFragmentManager().beginTransaction().replace(android.R.id.content, pf).commit();
// pf.getPreferenceScreen() throws a NullPointerException here
}
@Override
protected void onPause() {
super.onPause();
PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this);
}
@Override
protected void onResume() {
super.onResume();
updateSummary();
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
if (key.equals(PREF_KEY)) {
updateSummary();
}
}
private void updateSummary() {
Preference p = pf.getPreferenceScreen().findPreference(PREF_KEY);
p.setSummary("Some string containing the updated value");
}
}
PreferenceFragment 同样简单:
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
// At this point getPreferenceScreen() returns correctly
}
}
事情是这样的:在PreferenceFragment 上调用getPreferenceScreen(),在它被实例化并添加到PrefsActivity 的onCreate 中的Activity 之后,立即抛出一个NullPointerException。似乎getPreferenceScreen() 在对addPreferencesFromResource() 的调用返回后立即开始在PrefsFragment 的onCreate() 中返回一个PreferenceScreen 对象。
所以我的问题是:由于PreferenceFragment 被添加到Activity 后,getPreferenceScreen() 立即抛出 NPE,所以 PreferenceFragment 的 onCreate() 是否异步调用/在不同的线程中?否则我会期望getPreferenceScreen() 在getFragmentManager().beginTransaction().replace(android.R.id.content, pf).commit() 之后立即正常返回。
【问题讨论】: