13

私はCheckBoxPreferenceにありFragmentPreferenceます。ユーザーがチェックボックスをアクティブにすると、アプリケーションがインストールされているかどうかを確認し、インストールされていない場合は、設定をfalseにリセットし、Playストアを開いてアプリをダウンロードします。

基本的にすべて正常に動作しますが、UIを更新する際に問題があります。実際、Playストアを開く前に設定をfalseに設定した場合でも、ユーザーが戻ってきたときにチェックボックスがオンになります(フラグメントは一時停止および再開されたため、設定値は無視されます)。

アクティビティまたはフラグメントを「更新」する方法はありますか?

4

1 に答える 1

20

PreferenceFragmentにOnSharedPreferenceChangeListenerインターフェースを実装させます。

ではonCreate()、設定値を読み取り、それに応じてUIを設定できます。例えば:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load the preferences from an XML resource.
    addPreferencesFromResource(R.xml.shakesql_app_prefs);

    // Initialize pref summary label.

    // Get a reference to the application default shared preferences.
    SharedPreferences sp = getPreferenceScreen().getSharedPreferences();

    // Read the current preference value.
    String listVal =
            sp.getString(getString(R.string.preference_font_size_key),
                    getString(R.string.preference_font_size_default));

    // Look up the textual description corresponding to the
    // preference value and write it into the summary field.
    String listDesc = descriptionFromPref(
            listVal, 
            getResources().getStringArray(
                    R.array.preference_font_size_values), 
                    getResources().getStringArray(
                            R.array.preference_font_size_labels)
                    );
    if (!TextUtils.isEmpty(listDesc)) {
        ListPreference listPref =
                (ListPreference) findPreference(getString(R.string.preference_font_size_key));
        listPref.setSummary(listDesc);
    }
}

次に、でonSharedPreferenceChanged()、UIを更新します。

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference pref = findPreference(key);
    if (pref instanceof ListPreference) {
        // Update display title
        // Write the description for the newly selected preference 
        // in the summary field.
        ListPreference listPref = (ListPreference) pref;
        CharSequence listDesc = listPref.getEntry();
        if (!TextUtils.isEmpty(listDesc)) {
            pref.setSummary(listDesc);
        }
    }        
}

チェックボックス設定の値を強制するためのAPIデモのAdvancedPreferencesサンプルのコードスニペットを次に示します。

// Toggle the value of mCheckBoxPreference.
if (mCheckBoxPreference != null) {
            mCheckBoxPreference.setChecked(!mCheckBoxPreference.isChecked());
}
于 2012-08-10T14:10:54.420 に答える