【问题标题】:OnPreferenceChangeListener not called未调用 OnPreferenceChange 侦听器
【发布时间】:2016-03-21 16:21:44
【问题描述】:

当用户单击首选项并在摘要中显示所选日期时,我正在尝试启动日期选择器片段。

但是,当首选项值更改时,不会调用 OnPreferenceChangeListener。我验证了该值确实发生了变化。

我做错了吗?

这里是设置片段

// Configure setting start date
    Preference startDatePref = findPreference(getString(R.string.pref_start_date));
    startDatePref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {

        @Override
        public boolean onPreferenceClick(Preference preference) {
            DialogFragment startFragment = DatePickerFragment.newInstance(DatePickerFragment.PICK_START);
            startFragment.show(((AppCompatActivity) getActivity()).getSupportFragmentManager(), "Pick Start Date of Semester");
            return true;
        }
    });
    // Update the summary when date is picked
    startDatePref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            preference.setSummary(newValue.toString());
            Log.d("pref change", "called!");
            return true;
        }
    });

日期选择器

public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    SharedPreferences pref = getActivity().getSharedPreferences(
            getActivity().getString(R.string.date_info_file), Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = pref.edit();
    if (mType == PICK_START) {
        editor.putInt(getString(R.string.start_date_year), year);
        editor.putInt(getString(R.string.start_date_month), monthOfYear);
        editor.putInt(getString(R.string.start_date_day), dayOfMonth);
        UniData.setDataStatus(getActivity(), UniData.START_DATE, true);

        // Change the preference used in preferences.xml so that the onChange listener will be called
        SharedPreferences defaultPref = PreferenceManager.getDefaultSharedPreferences(getContext());
        SharedPreferences.Editor editDefault = defaultPref.edit();
        editDefault.putString(getString(R.string.pref_start_date), year + "-" + (monthOfYear + 1) + "-" + dayOfMonth);
        editDefault.commit();

        Log.d(LOG_TAG, "Start Picked: " + year + " " + monthOfYear + " " + dayOfMonth);
    }
    ... 
    editor.commit();

preferences.xml

<PreferenceCategory
    android:key="pref_key_schedule_settings"
    android:title="Schedule">
    <Preference
        android:defaultValue=""
        android:key="pref_start_date"
        android:summary="For the app to determine odd and even week."
        android:title="Set start date of semester"/>
</PreferenceCategory>

【问题讨论】:

    标签: android sharedpreferences android-preferences


    【解决方案1】:

    我遇到了类似的问题,并通过在我的自定义首选项中调用callChangeListener(myNewValue); 解决了它,例如:

    @Override
    protected void onDialogClosed(boolean positiveResult) {
        super.onDialogClosed(positiveResult);
        if (positiveResult && mSelectedDate != null) {
            persistDate(mSelectedDate);
            callChangeListener(mSelectedDate);
        }
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-30
      • 2019-07-25
      • 2019-01-26
      • 2012-04-08
      • 2017-09-24
      • 1970-01-01
      相关资源
      最近更新 更多