上sharedPreference對話框變量我知道這是一個簡單的事情,但我不能找到一種方法,這樣做的權利。我可能已經設計了我所知道的全部錯誤。顯示設置屏幕
我有一個PreferenceFragment,用戶可以瀏覽到使用在我的應用程序的主要片段選項菜單。 (我的應用程序只有1個活動和3個片段。) 此PreferenceFragment是隻有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);
}
}
TimePreference類,顯示TimePicker
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中選擇的值?
它現在被竊聽我幾天。任何人都可以指導我嗎?
感謝您的答覆。我發佈的代碼包含了更新sharedPrefs的代碼。 onSharedPreferenceChanged在用戶更改TimePicker上的時間時調用,然後單擊確定,然後調用您正確提及的setDisplayTime未附加到活動。但是,當我所做的只是拋出一個對話框時,它爲什麼會分離,這讓我感到困惑。其次,在你建議的解決方案中,isMenuVisible()是什麼?這是您希望我創建並檢查對話框可見性的方法嗎?如果是這樣,那麼它始終是錯誤的,因爲此時對話框已經關閉。 – LeoNeo
我發佈的方法是一個片段默認方法來檢查菜單是否當前對用戶可見(如果片段被去除,則返回false)。一旦不再需要該片段就立即從該活動中分離出片段,但該片段將存儲在片段管理器中。 – iGio90