4

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");
    }

}

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()と、インスタンス化されてinにPreferenceFragment追加された直後に.がスローされます。return の呼び出し直後に、ofでオブジェクトを返し始めるようです。ActivityonCreatePrefsActivityNullPointerExceptiongetPreferenceScreen()PreferenceScreenonCreate()PrefsFragmentaddPreferencesFromResource()

だから私の質問はこれです:が に追加されたgetPreferenceScreen()直後に NPE をスローするので、のは非同期的に/別のスレッドで呼び出されますか? そうでなければ、 の直後に正常に戻ると思っていたでしょう。PreferenceFragmentActivityonCreate()PreferenceFragmentgetPreferenceScreen()getFragmentManager().beginTransaction().replace(android.R.id.content, pf).commit()

4

1 に答える 1

5

PreferenceFragment の onCreate() は非同期的に/別のスレッドで呼び出されますか?

いいえ、メイン スレッドで同期的に実行されます。つまり、実行する前にActivitysonCreateが終了するまで待機する必要があります。はコールバックをFragmentManager スケジュールしますが、(アクティビティの) Fragment現在のコールバックが完了するまで実行されません。onCreate

にアクセスする場所が他にもいくつかありますPreferenceScreenOnStartは UI の準備ができたときに呼び出されるため、Fragment準備が整います。 onResume後でonStart呼び出され、一時停止から戻った後に呼び出されるため、おそらく何かを置くのに最適な場所です。

于 2013-01-23T07:14:07.780 に答える