Android Activity / PreferenceFragment生命周期?

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()开始PreferenceScreenonCreate()of中返回一个对象。PrefsFragmentaddPreferencesFromResource()

所以我的问题是这样的:既然getPreferenceScreen()抛出后,立即在NPE PreferenceFragment已被添加到了Activity,是onCreate()PreferenceFragment异步调用/在不同的线程?否则,我期望getPreferenceScreen()过后能正常返回getFragmentManager().beginTransaction().replace(android.R.id.content, pf).commit()

iag*_*een 5

在不同线程中异步调用PreferenceFragment的onCreate()?

不,它在主线程上同步运行。这意味着它必须等到Activitys onCreate退出后才能运行。该FragmentManager 时间表Fragment回调,但他们没有,直到当前的回调(执行onCreate的活动)完成。

您还有其他几个地方可以访问您的PreferenceScreenOnStart在用户界面准备就绪时调用,因此Fragment将准备就绪。 onResume之后被调用,onStart并且可能是放置某些内容的最佳位置,因为它也是从暂停返回后被调用的。