Android活动/首选项片段的生命周期?

4

我有一个非常简单的偏好设置,其中在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()能够正常返回。
1个回答

5

PreferenceFragmentonCreate() 方法是同步在主线程中运行的吗?

不是的,它是同步在主线程中运行的。这意味着它必须等到ActivityonCreate方法执行完毕后才能运行。 FragmentManager 调度 Fragment 回调方法,但直到当前回调(即 ActivityonCreate)完成后才会执行。

您还有其他几个地方可以访问您的 PreferenceScreenOnStart 在 UI 就绪时被调用,因此 Fragment 将准备就绪。 onResumeonStart 之后被调用,可能是最好的放置位置,因为它在从暂停状态返回后也会被调用。


非常感谢。我在onCreate()方法中调用getPreferenceScreen()时遇到了困难。现在,通过在onStart()中调用它,我终于解决了这个问题。 - Duc Tran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接