0

上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中選擇的值?

它現在被竊聽我幾天。任何人都可以指導我嗎?

回答

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); 
    } 
} 
+0

感謝您的答覆。我發佈的代碼包含了更新sharedPrefs的代碼。 onSharedPreferenceChanged在用戶更改TimePicker上的時間時調用,然後單擊確定,然後調用您正確提及的setDisplayTime未附加到活動。但是,當我所做的只是拋出一個對話框時,它爲什麼會分離,這讓我感到困惑。其次,在你建議的解決方案中,isMenuVisible()是什麼?這是您希望我創建並檢查對話框可見性的方法嗎?如果是這樣,那麼它始終是錯誤的,因爲此時對話框已經關閉。 – LeoNeo

+0

我發佈的方法是一個片段默認方法來檢查菜單是否當前對用戶可見(如果片段被去除,則返回false)。一旦不再需要該片段就立即從該活動中分離出片段,但該片段將存儲在片段管理器中。 – iGio90