4

我有一个非常简单的首选项设置,其中 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它被实例化并添加到ActivityinonCreate之后立即调用PrefsActivity,抛出一个NullPointerException. 似乎在调用返回后立即getPreferenceScreen()开始返回of 中的PreferenceScreen对象。onCreate()PrefsFragmentaddPreferencesFromResource()

所以我的问题是:由于在被添加到getPreferenceScreen()之后立即抛出 NPE ,被异步调用的 是在不同的线程中吗?否则我会期望在之后立即正常返回。PreferenceFragmentActivityonCreate()PreferenceFragmentgetPreferenceScreen()getFragmentManager().beginTransaction().replace(android.R.id.content, pf).commit()

4

1 回答 1

5

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

不,它在主线程上同步运行。这意味着它必须等到ActivitysonCreate退出才能运行。FragmentManager 调度Fragment回调,但直到当前回调(活动的)完成后才会执行onCreate

You have a few other places to access your PreferenceScreen. OnStart is called when the UI is ready, so the Fragment will be ready. onResume is called after onStart and is probably the best place to put something since it is invoked after coming back from a pause, too.

于 2013-01-23T07:14:07.780 回答