1

我想創建一個簡單的(是/否)對話框的偏好,我跟着這個職位的答案 - creating a DialogPreference from XMLDialogPreference原因錯誤onDisplayPreferenceDialog()

但我得到一個錯誤說

java.lang.IllegalArgumentException: Tried to display dialog for unknown preference type. Did you forget to override onDisplayPreferenceDialog()? 
    at android.support.v7.preference.PreferenceFragmentCompat.onDisplayPreferenceDialog(PreferenceFragmentCompat.java:647) 
    at android.support.v7.preference.PreferenceManager.showDialog(PreferenceManager.java:553) 
    at android.support.v7.preference.DialogPreference.onClick(DialogPreference.java:262) 
    at android.support.v7.preference.Preference.performClick(Preference.java:1115) 
    at android.support.v7.preference.Preference.performClick(Preference.java:1100) 
    at android.support.v7.preference.Preference$1.onClick(Preference.java:170) 
    at android.view.View.performClick(View.java:4756) 
    at android.view.View$PerformClick.run(View.java:19749) 
    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:5221) 
    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:899) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

我的XML

<android.support.v7.preference.PreferenceCategory android:title="History &amp; privacy"> 

    <com.game.prefs.views.DialogPref 
     android:key="pref_clear_search" 
     android:title="Reset Quests" 
     android:summary="Reset all quest-progress." 
     android:dialogMessage="Are you sure you wish to reset your quest progress? This action cannot be undone!" 
     android:positiveButtonText="Clear Quests" 
     android:negativeButtonText="Cancel"/> 
</android.support.v7.preference.PreferenceCategory> 

我的JAVA代碼

public class DialogPref extends DialogPreference { 
    public DialogPref(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
} 

我在做什麼錯?

+0

我認爲我的回答並不真正有用,所以我會刪除它。但是我找到了兩個可以幫助你的鏈接:[Github上的codepath/android_guides](https://github.com/codepath/android_guides/wiki/Settings-with-PreferenceFragment)和[構建自定義首選項](https://從官方文檔(比較容易,一旦我開始專門尋找... Compat),它說,你必須「指定用戶界面」 - (從開發人員手冊中找到http://developer.android.com/guide/topics/ui/settings.html#Custom)也許這是缺少的一塊?祝你好運! – 0X0nosugar

+0

謝謝,我會試試看,並讓你知道。 – ThunderRoid

+0

@ 0X0nosugar非常感謝這些鏈接,最後想通了 – ThunderRoid

回答

1

解決方案:在PreferenceFragment.java重寫以下方法

@Override 
public void onDisplayPreferenceDialog(Preference preference) { 
    if (preference instanceof CustomDialogPreference) { 
     DialogFragment dialogFragment = DialogPrefFragCompat.newInstance(preference.getKey()); 
     dialogFragment.setTargetFragment(this, 0); 
     dialogFragment.show(getFragmentManager(), null); 
    } else super.onDisplayPreferenceDialog(preference); 
} 

CustomDialogPreference的.java

public class CustomDialogPreference extends DialogPreference { 
    public CustomDialogPreference(Context context) { 
     this(context, null); 
    } 

    public CustomDialogPreference(Context context, AttributeSet attrs) { 
     this(context, attrs, R.attr.dialogPreferenceStyle); 
    } 

    public CustomDialogPreference(Context context, AttributeSet attrs, int defStyleAttr) { 
     this(context, attrs, defStyleAttr, defStyleAttr); 
    } 

    public CustomDialogPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 
} 

DialogPrefFragCompat.java

public class DialogPrefFragCompat extends PreferenceDialogFragmentCompat { 
    public static DialogPrefFragCompat newInstance(String key) { 
     final DialogPrefFragCompat fragment = new DialogPrefFragCompat(); 
     final Bundle bundle = new Bundle(1); 
     bundle.putString(ARG_KEY, key); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

    @Override 
    public void onDialogClosed(boolean positiveResult) { 
     if (positiveResult) { 
      // do things 
     } 
    } 
} 

XML:

<android.support.v7.preference.PreferenceCategory android:title="History &amp; privacy"> 
    <com.game.prefs.views.CustomDialogPreference 
     android:key="pref_clear_search" 
     android:title="Reset Quests" 
     android:summary="Reset all quest-progress." 
     android:dialogMessage="Are you sure you wish to reset your quest progress? This action cannot be undone!" 
     android:dialogTitle="" 
     android:positiveButtonText="Clear Quests" 
     android:negativeButtonText="Cancel"/> 
</android.support.v7.preference.PreferenceCategory> 
+0

我在這裏遇到同樣的問題。什麼是「PreferenceFragment」,以及它如何連接到您的自定義首選項CustomDialogPreference中? – ashario

相關問題