2012-06-06 91 views
2

我使用RingtonePreference並希望使用默認通知聲音作爲默認首選項值。爲了達到這個目的,我遵循以下建議:RingtonePreference Default valueRingtonePreference defaultValue InflateException

不幸的是,實際上我得到了一個我無法以任何方式擺脫的InflateException。它是Android中的錯誤,我的手機還是我做錯了什麼?

OnCreate方法MyPreferenceActivity類:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.preferences); 
} 

的相關片段,我preferences.xml

06-06 22:44:07.697: E/ActivityThread(21031): Failed to inflate 
06-06 22:44:07.697: E/ActivityThread(21031): android.view.InflateException: Binary XML file line #17: Error inflating class java.lang.reflect.Constructor 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.GenericInflater.createItem(GenericInflater.java:397) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.GenericInflater.onCreateItem(GenericInflater.java:417) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.GenericInflater.createItemFromTag(GenericInflater.java:428) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.GenericInflater.rInflate(GenericInflater.java:481) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.GenericInflater.rInflate(GenericInflater.java:493) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.GenericInflater.inflate(GenericInflater.java:326) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.GenericInflater.inflate(GenericInflater.java:263) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:269) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.PreferenceActivity.addPreferencesFromResource(PreferenceActivity.java:1457) 
06-06 22:44:07.697: E/ActivityThread(21031): at com.stanwise.timespacereminder.TSRPreferenceActivity.onCreate(TSRPreferenceActivity.java:44) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.app.Activity.performCreate(Activity.java:4465) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2105) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.app.ActivityThread.access$600(ActivityThread.java:133) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.os.Looper.loop(Looper.java:137) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.app.ActivityThread.main(ActivityThread.java:4586) 
06-06 22:44:07.697: E/ActivityThread(21031): at java.lang.reflect.Method.invokeNative(Native Method) 
06-06 22:44:07.697: E/ActivityThread(21031): at java.lang.reflect.Method.invoke(Method.java:511) 
06-06 22:44:07.697: E/ActivityThread(21031): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
06-06 22:44:07.697: E/ActivityThread(21031): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
06-06 22:44:07.697: E/ActivityThread(21031): at dalvik.system.NativeStart.main(Native Method) 
06-06 22:44:07.697: E/ActivityThread(21031): Caused by: java.lang.reflect.InvocationTargetException 
06-06 22:44:07.697: E/ActivityThread(21031): at java.lang.reflect.Constructor.constructNative(Native Method) 
06-06 22:44:07.697: E/ActivityThread(21031): at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.GenericInflater.createItem(GenericInflater.java:383) 
06-06 22:44:07.697: E/ActivityThread(21031): ... 23 more 
06-06 22:44:07.697: E/ActivityThread(21031): Caused by: java.lang.NullPointerException 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.MultiSelectListPreference.onGetDefaultValue(MultiSelectListPreference.java:211) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.Preference.<init>(Preference.java:260) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.DialogPreference.<init>(DialogPreference.java:69) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.DialogPreference.<init>(DialogPreference.java:90) 
06-06 22:44:07.697: E/ActivityThread(21031): at android.preference.MultiSelectListPreference.<init>(MultiSelectListPreference.java:49) 
06-06 22:44:07.697: E/ActivityThread(21031): ... 26 more 

我也試過將一個字符串DEFAULT_NOTIFICATION_URI

<RingtonePreference 
     android:key="ringtone_preference" 
     android:ringtoneType="notification" 
     android:showDefault="true" 
     android:showSilent="true" 
     android:defaultValue="content://settings/system/notification_sound" 
     android:title="Notification sound" 
     android:summary="" 
     /> 

異常的logcat的而不是content://settings/system/notification_sound,但沒有任何成功。在完全刪除android:defaultValue字段之後,除了事實之外,一切都正常工作,我的首選項的默認值是默認通知聲音的靜音鈴聲,這對我來說是不可接受的。

我到處搜索並找不到解決此問題的方法。如果沒有其他工作,我會使用一個黑客發佈在這裏:https://stackoverflow.com/a/4298638/1265432,但我想解決這個問題。

編輯:我的CM9摩托羅拉Defy和仿真器4.0.4(API 15)和2.1(API 7)存在問題,所以我認爲手機不是問題。錯誤,或者我做錯了什麼?

+0

如果您記錄'Settings.System.DEFAULT_NOTIFICATION_URI'常量的值,那麼它是否與您期望的相同?如果是這樣,它看起來像一個Android錯誤。如果不是,那麼它只是將其值從設備/ API更改爲設備/ API,然後唯一的方法是以編程方式進行設置。 –

+0

是的,'Settings.System.DEFAULT_NOTIFICATION_URI ==「content:// settings/system/notification_sound」' – stanwise

回答

0

我提交了一份bug報告爲Android瀏覽:http://code.google.com/p/android/issues/detail?id=33220

在此期間,我用以下解決方法,我發現一個比這個問題掛鉤清潔。我修改的MyPreferenceActivityOnCreate方法是:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Uri notificationSound = Uri.parse(PreferenceManager.getDefaultSharedPreferences(this) 
    .getString("ringtone_preference", System.DEFAULT_NOTIFICATION_URI.toString())); 
    if (notificationSound.equals(System.DEFAULT_NOTIFICATION_URI)) { 
     PreferenceManager.getDefaultSharedPreferences(this).edit() 
      .putString("ringtone_preference", System.DEFAULT_NOTIFICATION_URI.toString()) 
      .commit(); 
    } 

    addPreferencesFromResource(R.xml.preferences); 
} 
0

我對你的錯誤報告對什麼問題還真是有些見解的評論。

反正這裏有一個簡單的解決方法是對我的作品:

添加默認值的MultiSelectListPreference RingtonePreference後到來在你的喜好XML:

<MultiSelectListPreference 
     ... 
     android:defaultValue="@array/empty" 
     ... 
     /> 

而且在strings.xml:

<string-array name="empty"/>