我有一个非常简单的首选项设置,其中 aPreferenceFragment
添加到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
}
}
getPreferenceScreen()
事情是这样的:在PreferenceFragment
它被实例化并添加到Activity
inonCreate
之后立即调用PrefsActivity
,抛出一个NullPointerException
. 似乎在调用返回后立即getPreferenceScreen()
开始返回of 中的PreferenceScreen
对象。onCreate()
PrefsFragment
addPreferencesFromResource()
所以我的问题是:由于在被添加到getPreferenceScreen()
之后立即抛出 NPE ,被异步调用的 是在不同的线程中吗?否则我会期望在之后立即正常返回。PreferenceFragment
Activity
onCreate()
PreferenceFragment
getPreferenceScreen()
getFragmentManager().beginTransaction().replace(android.R.id.content, pf).commit()