【问题标题】:Android Activity/PreferenceFragment lifecycle?Android Activity/PreferenceFragment 生命周期?
【发布时间】:2013-01-23 06:21:06
【问题描述】:

我有一个非常简单的首选项设置,其中将PreferenceFragment 添加到ActivityActivity 也是 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
    }

}

事情是这样的:在PreferenceFragment 上调用getPreferenceScreen(),在它被实例化并添加到PrefsActivityonCreate 中的Activity 之后,立即抛出一个NullPointerException。似乎getPreferenceScreen() 在对addPreferencesFromResource() 的调用返回后立即开始在PrefsFragmentonCreate() 中返回一个PreferenceScreen 对象。

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

【问题讨论】:

    标签: android android-lifecycle


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢。我在 onCreate() 方法中调用 getPreferenceScreen() 时卡住了。现在我终于通过在 onStart() 中调用它来实现它
    猜你喜欢
    • 2013-04-06
    • 2013-07-10
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2016-11-15
    • 2011-07-29
    相关资源
    最近更新 更多