缺少DialogPreference的构造函数

时间:2017-05-27 03:21:22

标签: android kotlin

我正在将项目转换为Kotlin。当我转换对话首选项时,应用程序崩溃了“没有这样的方法”,显然构造函数丢失了。这是错误消息:

05-26 20:13:32.799  6019  6019 E AndroidRuntime: Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
05-26 20:13:32.799  6019  6019 E AndroidRuntime:    at java.lang.Class.getConstructor0(Class.java:2204)
05-26 20:13:32.799  6019  6019 E AndroidRuntime:    at java.lang.Class.getConstructor(Class.java:1683)
05-26 20:13:32.799  6019  6019 E AndroidRuntime:    at android.preference.GenericInflater.createItem(GenericInflater.java:378)

该类具有错误消息抱怨的2参数构造函数:

class FilterPreferenceFragment(context: Context, attrs: AttributeSet?) :
    BaseDialogPreference(context, attrs) {
    /* */
}

基类:

abstract class BaseDialogPreference(context: Context, attrs: AttributeSet?) :
    DialogPreference(context, attrs) {
    /* */
}

有什么建议吗?

编辑:

如果它有用,这里是Kotlin编译器生成的字节码:

  // access flags 0x1
  public <init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
    @Lorg/jetbrains/annotations/Nullable;() // invisible, parameter 1
   L0
    ALOAD 1
    LDC "context"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull (Ljava/lang/Object;Ljava/lang/String;)V
   L1
    LINENUMBER 12 L1
    ALOAD 0
    ALOAD 1
    ALOAD 2
   L2
    LINENUMBER 13 L2
    INVOKESPECIAL android/preference/DialogPreference.<init> (Landroid/content/Context;Landroid/util/AttributeSet;)V
    RETURN
   L3
    LOCALVARIABLE this Lcom/example/exampleapp/app/preference/BaseDialogPreference; L0 L3 0
    LOCALVARIABLE context Landroid/content/Context; L0 L3 1
    LOCALVARIABLE attrs Landroid/util/AttributeSet; L0 L3 2
    MAXSTACK = 3
    MAXLOCALS = 3

  @Lkotlin/Metadata;(mv={1, 1, 6}, bv={1, 0, 1}, k=1, d1={"\u0000$\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\u0008\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\u0008&\u0018\u00002\u00020\u0001B\u0017\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0008\u0010\u0004\u001a\u0004\u0018\u00010\u0005\u00a2\u0006\u0002\u0010\u0006J\u0010\u0010\u0007\u001a\u00020\u00082\u0006\u0010\u0009\u001a\u00020\nH\u0014\u00a8\u0006\u000b"}, d2={"Lcom/example/exampleapp/app/preference/BaseDialogPreference;", "Landroid/preference/DialogPreference;", "context", "Landroid/content/Context;", "attrs", "Landroid/util/AttributeSet;", "(Landroid/content/Context;Landroid/util/AttributeSet;)V", "onBindView", "", "view", "Landroid/view/View;", "production sources for module ExampleApp"})
  // compiled from: BaseDialogPreference.kt

1 个答案:

答案 0 :(得分:1)

原来我看错了班级。错误来自另一个偏好:

class BaseCheckBoxPreference(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : CheckBoxPreference(context, attrs, defStyleAttr) { /* */ }

要解决崩溃,我必须从构造函数中删除第三个参数:

class BaseCheckBoxPreference(context: Context, attrs: AttributeSet? = null) : CheckBoxPreference(context, attrs) { /* */ }

或者,我们可以定义一个只接受2个参数的辅助构造函数,但对于我的用例,我只需要一个带有2个参数的构造函数。辅助构造函数是

class BaseCheckBoxPreference(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : CheckBoxPreference(context, attrs, defStyleAttr) {

constructor(context: Context, attrs: AttributeSet? = null) : this(context, attrs, 0)

/* */
}