2016-02-29 8 views
8

Ich erstelle eine App mit einer AppCompactActivity und alle anderen Ansichten verwenden Fragment. Also möchte ich PreferenceFragmentCompat verwenden. Aber ich erhalte den folgenden Fehler, wenn ich das erstelle.Wie implementiere ich 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 

Bitte lassen Sie mich wissen, ist es eine Möglichkeit, Klingelton bevorzugt in PreferenceFragmentCompat zu implementieren?

+0

So haben Sie die Lösung gefunden? Ich habe den gleichen Fehler, ich muss weiterhin die Support-Bibliothek verwenden und es gibt keine RingtonePreference drin ... – Vucko

Antwort

2

Für heute existiert Klingelton-Präferenz nicht in der Support-Bibliothek. Sie müssen die Version des Frameworks verwenden oder Ihre eigene Version erstellen.
ich denke, es erscheint bald

+2

Wie genau verwenden Sie die Framework-Version? – toobsco42

11

Nicht meine Lösung, aber ich es trotzdem zu veröffentlichen, weil es funktioniert.

In Ihren Einstellungen XML-Ressource, ändern RingtonePreference zu Preference. Dann in Ihrer Implementierung von PreferenceFragment hinzu:

@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

Es ist besser, einen Link zur Quelle anzugeben. – Sufian

Verwandte Themen