在设置屏幕上显示sharedPreference对话框变量



我知道这是一件简单的事情,但我找不到正确的方法。据我所知,我可能设计错了。

我有一个PreferenceFragment,用户可以使用我的应用程序中主片段上的选项菜单导航到它。(我的应用程序只有1个活动和3个片段。)此首选片段是只有1个选项的设置屏幕。单击该选项会向用户显示一个带有TimePicker的对话框。我使用DialogPreference来显示TimePicker对话框。当用户选择时间时,我想在设置屏幕中显示所选时间。

下面的代码以及屏幕截图。

显示设置屏幕的PreferenceFragment类。

public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = SettingsFragment.class.getSimpleName();
private static String mDisplayTime;
@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    mDisplayTime = Utils.getAlarmTime(getActivity()).toString();
}
@Override
public void onResume() {
    super.onResume();
    final Preference preferenceFragment = getPreferenceScreen().findPreference("pref_set_time");
    setDisplayTime();
    preferenceFragment.setSummary(mDisplayTime);
}
@Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
    Log.d(TAG, "SharedPreferences changed");
    if (key.equals(Utils.PREFERENCE_TIME_KEY)) {
        mDisplayTime = sharedPreferences.getString(Utils.PREFERENCE_TIME_KEY, null);
        setDisplayTime(); //CALL TO THIS METHOD CAUSES EXCEPTION BELOW
    }
}
private void setDisplayTime() {
    final DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("HH:mm");
    final String time = TextUtils.isEmpty(mDisplayTime) ? getString(R.string.not_set) : dateTimeFormatter.print(
            new DateTime(mDisplayTime));
    //EXCEPTION THROWN in the below line
    //java.lang.IllegalStateException: Fragment SettingsFragment{200ac3eb} not attached to Activity
    mDisplayTime = getString((R.string.pref_set_reminder_time_summary), time); 
}
}

显示TimePicker 的TimePreference类

public class TimePreference extends DialogPreference implements TimePicker.OnTimeChangedListener {
private DateTime mTime;
@Override
public View onCreateDialogView() {
    mTime = Utils.getAlarmTime(getContext()); //Gets the time from the sharedPreferences
    final int hour;
    final int min;
    if (mTime == null) {
        hour = DateTime.now().getHourOfDay();
        min = DateTime.now().getMinuteOfHour();
    } else {
        hour = mTime.getHourOfDay();
        min = mTime.getMinuteOfHour();
    }
    final TimePicker mTimePicker = new TimePicker(getContext());
    mTimePicker.setOnTimeChangedListener(this);
    mTimePicker.setCurrentHour(hour);
    mTimePicker.setCurrentMinute(min);
    return mTimePicker;
}
@Override
public void onDialogClosed(final boolean positiveResult) {
    if (positiveResult) {
        persistString(mTime.toString());
    }
}
@Override
public void onTimeChanged(final TimePicker timePicker, final int hourOfDay, final int minute) {
    mTime = new DateTime(DateTime.now().getYear(), DateTime.now().getMonthOfYear(), DateTime.now().getDayOfMonth(),
            hourOfDay, minute);
}
}

我在代码中提到的行上得到以下异常:

java.lang.IllegalStateException: Fragment SettingsFragment{200ac3eb} not attached to Activity

场景:我单击设置屏幕上的选项-->DialogPreference(TimePicker)对话框打开-->设置时间-->确定-->一切正常-->重复此过程-->单击设置屏幕中的选项-->DialogPreference!!!

我认为它试图在上下文上调用getString(),由于getActivity返回null,它抛出了一个异常,但除此之外,我如何设置用户在SettingsFragment字段的TimePicker中选择的值?

这几天来一直困扰着我。有人能指导我吗?

我想我可以向您介绍解决方案,否则您将需要向我发布更新sharedpref的代码。我可以猜测,当您更新prefs时,监听器将收到回调,而片段没有附加到活动。无论如何,你可以避免这个问题:

private void setDisplayTime() {
    if (isMenuVisible()) {
        final DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("HH:mm");
        final String time = TextUtils.isEmpty(mDisplayTime) ? getString(R.string.not_set) : dateTimeFormatter.print(
            new DateTime(mDisplayTime));
        mDisplayTime = getString((R.string.pref_set_reminder_time_summary), time); 
    }
}

最新更新