-1

我使用PreferenceScreen在我的Android應用程序中設置一些用戶首選項。它適用於幾個ListPreferenceCheckboxPreference項目,但我無法得到RingtonePreference正常工作。顯示適當的鈴聲對話框,可以選擇,但選擇從不保存。RingtonePreference不保存在PreferenceActivity中

無論我選擇什麼,我的應用程序只播放默認聲音。無論何時我重新打開鈴聲對話框(選擇後立即或退出應用程序並重新開始後),它總是會選擇默認項目。我有一個顯示首選項值的字段,並且它始終顯示默認聲音被選中,即使在首選項屏幕上進行了更改。我還確認,使用DDMS監視設備時,我的設備上的適當xml文件(在/ data/data/myapp/shared_prefs中)不會改變。如果我更改其他項目(例如CheckboxPreference),則會看到shared_prefs文件實時更改。我已經將我的PreferenceScreen剝離到最低限度,並且仍然表現相同。我嘗試更改密鑰名稱,默認值和清除手機上的應用程序數據。似乎沒有任何工作。

我確實發現了2個類似的問題已經發布在SO上(herehere),但它們已有幾個月大了,沒有答案和/或提出問題的人放棄了並嘗試了另一種方法。我想弄清楚它爲什麼不按照設計工作......或者至少找到一個合適的方法來完成同樣的事情。

我的代碼的相關部分在下面..先謝謝了!

/res/xml/preferences.xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 
    <RingtonePreference 
    android:key="alertSound" 
    android:ringtoneType="notification" 
    android:summary="Select audio notification sound" 
    android:title="Alert Sound" > 
    </RingtonePreference> 
</PreferenceScreen> 

/src/myapp/EditPrefsActivity.java:

public class EditPrefsActivity extends PreferenceActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    settings = PreferenceManager.getDefaultSharedPreferences(this); 
    addPreferencesFromResource(R.xml.preferences); 
    } 
} 
+0

我繼續調整這沒有任何運氣。爲了澄清,我的首選項屏幕有6個不同的項目;其他5個完美工作。我設置了一個OnSharedPreferenceChangeListener,可以正確觸發5個工作偏好項目,但它從不運行此鈴聲首選項。它的行爲基本上就像我在鈴聲選擇對話框中單擊取消而不是OK。該對話框正確顯示,所有通知鈴聲都在列表中,如果點擊它們則播放。但選擇從不保存。 – mike47 2013-02-18 18:54:20

+0

我的'Preference'示例應用程序都能夠保留其'RingtonePreference'。嘗試一個,如https://github.com/commonsguy/cw-omnibus/tree/master/Prefs/FragmentsBC,看看它是否適合你。如果它有效,那麼你可以開始努力縮小你的實施和我的差異。 – CommonsWare 2013-02-27 12:49:13

+0

感謝您的幫助,@CommonsWare,它實際上證明是一個模糊的Android bug與launchMode綁定。我在下面發佈瞭解決方案。 – mike47 2013-06-12 00:20:12

回答

1

我只是找到了解決辦法!答案最近發佈在一個類似的問題:https://stackoverflow.com/a/15887357/1992342

從清單中的EditPrefsActivity <activity>條目中刪除android:launchMode="singleInstance"解決了問題。顯然這是一個[鮮爲人知的] Android bug。