美文网首页
kotlin自定view构造方法写法

kotlin自定view构造方法写法

作者: 狼性代码人 | 来源:发表于2021-01-22 21:13 被阅读0次
  • 正确写法
  • 错误写法

一、正确写法:

  • 方法1:@JvmOverloads
class KoTabBottom @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : RelativeLayout(context, attrs, defStyleAttr) {
    init { }
}

对上面代码进行kotlin转java如下:

public final class KoTabBottom extends RelativeLayout {
   @JvmOverloads
   public KoTabBottom (@NotNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
      Intrinsics.checkNotNullParameter(context, "context");
      super(context, attrs, defStyleAttr);
   }

   // $FF: synthetic method
   public KoTabBottomLayout(Context var1, AttributeSet var2, int var3, int var4, DefaultConstructorMarker var5) {
      if ((var4 & 2) != 0) {
         var2 = (AttributeSet)null;
      }

      if ((var4 & 4) != 0) {
         var3 = 0;
      }

      this(var1, var2, var3);
   }

   @JvmOverloads
   public KoTabBottomLayout(@NotNull Context context, @Nullable AttributeSet attrs) {
      this(context, attrs, 0, 4, (DefaultConstructorMarker)null);
   }

   @JvmOverloads
   public KoTabBottomLayout(@NotNull Context context) {
      this(context, (AttributeSet)null, 0, 6, (DefaultConstructorMarker)null);
   }
   ........
}

注意:这里有一个KoTabBottomLayout(@NotNull Context context)的构造方法,下面的错误写法中没有此构造方法。

  • 方法2:
class KoTabBottom : RelativeLayout {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int)
            : super(context, attrs, defStyleAttr)
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int)
            : super(context, attrs, defStyleAttr, defStyleRes)

    init { }
}

二、 错误写法

class KoTabBottom(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : RelativeLayout(context, attrs, defStyleAttr) {
    init { }
}

注意:这种写法会导致java.lang.NoSuchMethodException错误,原因是在xml中创建控件需要一个context的构造函数。

对上面代码进行kotlin转java如下:

public final class KoTabBottom extends RelativeLayout {
   ........
   public KoTabBottom(@NotNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
      Intrinsics.checkNotNullParameter(context, "context");
      super(context, attrs, defStyleAttr);
   }
   ........
   // $FF: synthetic method
   public KoTabBottom(Context var1, AttributeSet var2, int var3, int var4, DefaultConstructorMarker var5) {
      if ((var4 & 2) != 0) {
         var2 = (AttributeSet)null;
      }

      if ((var4 & 4) != 0) {
         var3 = 0;
      }

      this(var1, var2, var3);
   }
   ........
}

错误分析:kotlin转换后的java代码是没有context的构造方法的。所以错误日志显示信息为java.lang.NoSuchMethodException

相关文章

网友评论

      本文标题:kotlin自定view构造方法写法

      本文链接:https://www.haomeiwen.com/subject/jqvezktx.html