我正在将项目转换为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
答案 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)
/* */
}