我有一个非常简单的偏好设置,其中在Activity
中添加了一个PreferenceFragment
。因为我想在特定的偏好项更新时更新摘要,所以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");
}
}
偏好设置片段同样简单:
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
// At this point getPreferenceScreen() returns correctly
}
}
事情是这样的:在PrefsActivity的onCreate方法中,创建并添加了一个PreferenceFragment,并立即调用该片段的getPreferenceScreen()方法,但会抛出NullPointerException异常。似乎,当PrefsFragment的addPreferencesFromResource()方法返回后,getPreferenceScreen()方法才开始返回PreferenceScreen对象。
所以我的问题是:由于在PreferenceFragment添加到Activity之后,getPreferenceScreen()方法立即引发NPE异常,那么PreferenceFragment的onCreate()方法是否是异步调用/在不同的线程中执行的?否则我希望在getFragmentManager().beginTransaction().replace(android.R.id.content, pf).commit()执行后getPreferenceScreen()能够正常返回。