2016-02-29 19 views
8

Sto creando un'app utilizzando AppCompactActivity e tutte le altre viste utilizzano Fragment. Quindi mi piacerebbe usare PreferenceFragmentCompat. Ma sto ottenendo il seguente errore quando creo questo.Come implementare RingtonePreference in PreferenceFragmentCompat?

02-29 10:50:01.080 9812-9812/com.example.main E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.example.main, PID: 9812 
    android.view.InflateException: Binary XML file line #12: Error inflating class (not found)RingtonePreference 
     at android.support.v7.preference.PreferenceInflater.createItemFromTag(PreferenceInflater.java:300) 
     at android.support.v7.preference.PreferenceInflater.rInflate(PreferenceInflater.java:358) 
     at android.support.v7.preference.PreferenceInflater.rInflate(PreferenceInflater.java:360) 
     at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:167) 
     at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:117) 
     at android.support.v7.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:115) 
     at android.support.v7.preference.PreferenceFragmentCompat.addPreferencesFromResource(PreferenceFragmentCompat.java:366) 
     at com.example.main.PreferenceFragmentSettings.onCreate(PreferenceFragmentSettings.java:18) 
     at android.support.v4.app.Fragment.performCreate(Fragment.java:1939) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1029) 
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738) 
     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613) 
     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5343) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700) 
    Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v7.preference.RingtonePreference" on path: DexPathList[[zip file "/data/app/com.example.main-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 
     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
     at android.support.v7.preference.PreferenceInflater.createItem(PreferenceInflater.java:233) 
     at android.support.v7.preference.PreferenceInflater.onCreateItem(PreferenceInflater.java:280) 
     at android.support.v7.preference.PreferenceInflater.createItemFromTag(PreferenceInflater.java:289) 
     at android.support.v7.preference.PreferenceInflater.rInflate(PreferenceInflater.java:358)  
     at android.support.v7.preference.PreferenceInflater.rInflate(PreferenceInflater.java:360)  
     at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:167)  
     at android.support.v7.preference.PreferenceInflater.inflate(PreferenceInflater.java:117)  
     at android.support.v7.preference.PreferenceManager.inflateFromResource(PreferenceManager.java:115)  
     at android.support.v7.preference.PreferenceFragmentCompat.addPreferencesFromResource(PreferenceFragmentCompat.java:366)  
     at com.example.main.PreferenceFragmentSettings.onCreate(PreferenceFragmentSettings.java:18)  
     at android.support.v4.app.Fragment.performCreate(Fragment.java:1939)  
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1029)  
     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248)  
     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:738)  
     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1613)  
     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:517)  
     at android.os.Handler.handleCallback(Handler.java:739)  
     at android.os.Handler.dispatchMessage(Handler.java:95)  
     at android.os.Looper.loop(Looper.java:135)  
     at android.app.ActivityThread.main(ActivityThread.java:5343)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at java.lang.reflect.Method.invoke(Method.java:372)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)  
    Suppressed: java.lang.ClassNotFoundException: android.support.v7.preference.RingtonePreference 
     at java.lang.Class.classForName(Native Method) 
     at java.lang.BootClassLoader.findClass(ClassLoader.java:781) 
     at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:504) 
      ... 25 more 
    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available 

Per favore fatemi sapere c'è un modo per implementare la preferenza per suoneria in PreferenceFragmentCompat?

+0

Quindi hai trovato la soluzione? Sto avendo lo stesso errore, devo continuare ad usare la libreria di supporto e non c'è RingtonePreference in esso ... – Vucko

risposta

2

Per oggi la preferenza suoneria non esiste nella libreria di supporto. È necessario utilizzare la versione del framework o crearne di propri.
Penso che apparirà presto

+2

Come usi esattamente la versione del framework? – toobsco42

11

Non è la mia soluzione, ma la postò comunque, perché funziona.

Nella preferenza risorsa XML, modificare il riferimento Ringtone a Preferenza. Poi, nell'implementazione di PreferenceFragment, aggiungere:

@Override 
public boolean onPreferenceTreeClick(Preference preference) { 
    if (preference.getKey().equals(KEY_RINGTONE_PREFERENCE)) { 
     Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); 
     intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); 
     intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); 
     intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, true); 
     intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, Settings.System.DEFAULT_NOTIFICATION_URI); 

     String existingValue = getRingtonePreferenceValue(); // TODO 
     if (existingValue != null) { 
      if (existingValue.length() == 0) { 
       // Select "Silent" 
       intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null); 
      } else { 
       intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, Uri.parse(existingValue)); 
      } 
     } else { 
      // No ringtone has been selected, set to the default 
      intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, Settings.System.DEFAULT_NOTIFICATION_URI); 
     } 

     startActivityForResult(intent, REQUEST_CODE_ALERT_RINGTONE); 
     return true; 
    } else { 
     return super.onPreferenceTreeClick(preference); 
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_CODE_ALERT_RINGTONE && data != null) { 
     Uri ringtone = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); 
     if (ringtone != null) { 
      setRingtonPreferenceValue(ringtone.toString()); // TODO 
     } else { 
      // "Silent" was selected 
      setRingtonPreferenceValue(""); // TODO 
     } 
    } else { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

Source.

+1

È meglio fornire anche il collegamento alla sorgente. – Sufian