2016-02-29 21 views
8

Bir AppCompactActivity kullanarak bir uygulama oluşturuyorum ve diğer tüm görünümler Fragment kullanıyor. Bu yüzden PreferenceFragmentCompat'ı kullanmak istiyorum. Ama bunu oluşturduğumda aşağıdaki hatayı alıyorum.PreferenceFragmentCompat'ta RingtonePreference nasıl uygulanır?

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 

Lütfen Tercih Et Tercih ettiğiniz PreferenceFragmentCompat uygulamasında Zil sesi tercihi uygulamak için bir yol var mı?

+0

Çözümü bulamadınız mı? Aynı hatayı yaşıyorum, destek kütüphanesini kullanmaya devam etmeliyim ve içinde RingtonePreference yok ... – Vucko

cevap

2

Bugün için zil sesi tercihi destek kütüphanede mevcut değil. Çerçevenin sürümünü kullanmanız veya kendi oluşturmanız gerekir.
Yakında göründüğünü düşünüyorum.

+2

Çerçevenin sürümünü tam olarak nasıl kullanıyorsunuz? – toobsco42

11

Çözümüm değil ama yine de gönderiyorum çünkü işe yarıyor.

Tercihlerinizde XML kaynağı olarak, RingtonePreference öğesini Tercihi olarak değiştirin. Ardından, PreferenceFragment sizin uygulanmasında, ekleyin:

@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

Kaynağa da link vermek daha iyidir. – Sufian