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
}
}
を呼び出すgetPreferenceScreen()
と、インスタンス化されてinにPreferenceFragment
追加された直後に.がスローされます。return の呼び出し直後に、ofでオブジェクトを返し始めるようです。Activity
onCreate
PrefsActivity
NullPointerException
getPreferenceScreen()
PreferenceScreen
onCreate()
PrefsFragment
addPreferencesFromResource()
だから私の質問はこれです:が に追加されたgetPreferenceScreen()
直後に NPE をスローするので、のは非同期的に/別のスレッドで呼び出されますか? そうでなければ、 の直後に正常に戻ると思っていたでしょう。PreferenceFragment
Activity
onCreate()
PreferenceFragment
getPreferenceScreen()
getFragmentManager().beginTransaction().replace(android.R.id.content, pf).commit()