如何在PreferenceFragmentCompat中实现RingtonePreference? [英] How to implement RingtonePreference in PreferenceFragmentCompat?

查看:90
本文介绍了如何在PreferenceFragmentCompat中实现RingtonePreference?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用一个AppCompactActivity创建一个应用程序,而所有其他视图都在使用Fragment.所以我想使用PreferenceFragmentCompat.但是创建此文件时出现以下错误.

I am creating an app using one AppCompactActivity and all other views are using Fragment. So I would like to Use PreferenceFragmentCompat. But i am getting the following error when I create this.

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

请告诉我,有什么方法可以在PreferenceFragmentCompat中实现铃声偏好设置?

Please let me know is there any way to implement Ringtone preference in PreferenceFragmentCompat ?

推荐答案

不是我的解决方案,但还是可以发布,因为它可行.

Not my solution, but I post it anyway, because it works.

在首选项XML资源中,将RingtonePreference更改为 偏爱.然后,在实现PreferenceFragment时,添加:

In you preferences XML resource, change RingtonePreference to Preference. Then, in your implementation of PreferenceFragment, add:

@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);
    }
}

来源.

这篇关于如何在PreferenceFragmentCompat中实现RingtonePreference?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆