我知道这是一件简单的事情,但我找不到办法做到这一点。我可能已经为我所知道的所有人设计了错误。
我有一个PreferenceFragment,用户可以使用我的应用程序中主片段上的选项菜单导航到。 (我的应用只有1个活动和3个片段。) 此PreferenceFragment是设置屏幕,只有一个选项。单击该选项会向用户显示带有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(TimePicker)对话框打开 - >设定时间 - >崩溃与上述异常!!!
我认为它试图在上下文中调用getString(),因为getActivity返回null,它会引发异常,但是如何在SettingsFragment字段的TimePicker中设置用户选择的值呢?
现在已经困扰了我好几天了。任何人都可以指导我吗?
答案 0 :(得分:0)
我想我可以指出您的解决方案,否则您需要向我发送您正在更新您的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);
}
}