2014-08-31 63 views
0

我以非標準方式使用首選項屏幕來設置名爲Reminder的類的值。當我打開EditReminder活動與現有的提醒,它拉從一個意圖適當的提醒,然後初始化偏好屏幕像這樣:Android偏好值行爲奇怪

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity()); 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    editor.putString("temp_name",reminder.getName()); 
    Toast.makeText(getActivity(), reminder.getName(), Toast.LENGTH_LONG).show(); 
    editor.putString("temp_description",reminder.getDescription()); 
    editor.putString("temp_time",timeFormat.format(reminder.getDate().getTime())); 
    editor.putString("temp_date",dateFormat.format(reminder.getDate().getTime())); 
    editor.apply(); 

    name.setSummary(reminder.getName()); 
    description.setSummary(reminder.getDescription()); 
    time.setSummary(timeFormat.format(reminder.getDate().getTime())); 
    date.setSummary(dateFormat.format(reminder.getDate().getTime())); 

當我第一次打開應用程序,並嘗試編輯現有的提醒,這工作完美無瑕。但是,從那時起,摘要將被正確設置爲正確的值,並且如果我立即保存正確的值得到保存,所以代碼似乎正在工作。除了如果我點擊一個首選項,預填充的值是以前的提醒。

所以,如果我打開Reminder1並點擊名字,它prefills的EditText上對話框,「Reminder1」

然後,如果我打開Reminder2並點擊名字,它以「Reminder1」

prefills的EditText上對話框然後,如果我打開Reminder3並點擊名稱,它用「Reminder2」預填充edittext對話框

因爲我的logcat滯後了大約8分鐘,所以敬酒是爲了測試價值的,但那是另一個問題。吐司顯示正確的值。另外,正如我所提到的,總結設置爲正確的值,如果我保存而不做任何更改,它會保存正確的值。我很困惑。

每請求時,這裏是我保存用戶設置的值代碼:

SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 
    reminder.setName(sharedPreferences.getString("temp_name","")); 
    reminder.setDescription(sharedPreferences.getString("temp_description", "")); 
    Calendar date = Calendar.getInstance(); 
    SimpleDateFormat timeFormat = new SimpleDateFormat("h:mm aa"+"EEEE, MMMM d, yyyy"); 
    try { 
     date.setTime(timeFormat.parse(sharedPreferences.getString("temp_time", "") + sharedPreferences.getString("temp_date", ""))); 
    } 
    catch (ParseException e){ 
     Log.e("Minder","Parse Error"); 
    } 

    long time = date.getTimeInMillis();        //Drop seconds 
    time = time/60000;            // 
    time = time*60000;            // 
    date.setTimeInMillis(time);          // 
    reminder.setDate(date);           //Store reminder date + time 
    ReminderDBHelper dbHelper = ReminderDBHelper.getInstance(this); 
    SQLiteDatabase database = dbHelper.openDatabase(); 
    reminder.setId((int) Reminder.saveReminder(database,reminder));//Save reminder to database 

和相關的XML:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 

<EditTextPreference android:title="Name" 
    android:key="temp_name" 
    android:summary="@string/name_summary" 
    android:inputType="textCapSentences" 
    android:singleLine="true"/> 

<EditTextPreference android:title="Description" 
    android:key="temp_description" 
    android:summary="@string/description_summary" 
    android:inputType="textCapSentences|textMultiLine"/> 

<us.bridgeses.Minder.util.TimePreference android:title="Time" 
    android:key="temp_time" 
    android:inputType="time"/> 

<us.bridgeses.Minder.util.DatePreference android:title="Date" 
    android:key="temp_date" 
    android:inputType="date"/> 
</PreferenceScreen> 
+0

我們需要看到更多的代碼。顯示UI代碼,根據首選項填充值。 – 2014-08-31 02:58:18

+0

您需要了解如何使用Eclipse或Android Studio調試器。 – 2014-08-31 03:08:42

+0

我正在處理它。但作爲對我的問題的回答,這是一個非常無益的評論。 – TBridges42 2014-08-31 03:09:57

回答

0

解決它!

我通過EditTextPreference的源代碼捅了捅,發現初始化它的內部存儲變量後,就立即初始化了它的內部存儲變量,而不是(因爲我出於某種原因假定)在實際訪問該首選項時。

我在做上述分配後調用addPreferencesFromResource,這意味着正在調用任務前的喜好進行intializing他們的價值觀。我把這個調用移動到變量賦值之後,它工作正常。

我最初只分配了摘要,我通過從xml中提取首選項來完成。這必須在addPreferencesFromResource之後完成,否則將不會有xml提取。然而,值賦值直接通過SharedPreferences.Editor完成,並且不需要首先關聯xml。

0

你的代碼看起來除了一行不錯。

我從來沒有使用申請()我總是用提交()

按照DOCO:

http://developer.android.com/reference/android/content/SharedPreferences.Editor.html

不像提交(),它寫入其喜好進行同步持久存儲,應用()立即向內存中的SharedPreferences提交它的更改,但啓動對磁盤的異步提交,並且不會收到有關任何失敗的通知。如果此SharedPreferences上的另一個編輯器在apply()仍未完成時執行常規commit(),則commit()將會阻塞,直到完成所有異步提交以及提交本身。

我想如果沒有立即寫入持久性存儲,下次使用首屏時間,你會得到持續的數據(或默認)

+0

我有同樣的想法,除了兩件事: 1)我試過提交。這實際上是我想要嘗試的第一件事。 2)Android Studio在使用提交時發出警告,並告訴您使用apply – TBridges42 2014-08-31 03:33:52

+0

想到一個想法。你的最低sdk小於16嗎?存在兼容性問題,必須使用不同的共享偏好對象。 – smrg 2014-08-31 03:42:24

+0

它低於16,將它提高到16或以上沒有效果。 – TBridges42 2014-08-31 03:49:33