mwi*_*ock 4 android android-lifecycle
我有一个非常简单的偏好设置,其中将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");
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
事情getPreferenceScreen()是PreferenceFragment这样的:在实例化并将其添加到Activityin onCreate中之后,立即调用PrefsActivity会引发一个NullPointerException。似乎在调用return之后立即getPreferenceScreen()开始PreferenceScreen在onCreate()of中返回一个对象。PrefsFragmentaddPreferencesFromResource()
所以我的问题是这样的:既然getPreferenceScreen()抛出后,立即在NPE PreferenceFragment已被添加到了Activity,是onCreate()的PreferenceFragment异步调用/在不同的线程?否则,我期望getPreferenceScreen()过后能正常返回getFragmentManager().beginTransaction().replace(android.R.id.content, pf).commit()。
在不同线程中异步调用PreferenceFragment的onCreate()?
不,它在主线程上同步运行。这意味着它必须等到Activitys onCreate退出后才能运行。该FragmentManager 时间表Fragment回调,但他们没有,直到当前的回调(执行onCreate的活动)完成。
您还有其他几个地方可以访问您的PreferenceScreen。 OnStart在用户界面准备就绪时调用,因此Fragment将准备就绪。 onResume之后被调用,onStart并且可能是放置某些内容的最佳位置,因为它也是从暂停返回后被调用的。