lateinit属性尚未初始化

我有一个自定义的linearlayout类,当我想创建这个类的实例,我得到一个错误lateinit属性尚未初始化我正在使用最新版本的butterknife库

这是我的科林类

class MenuItemView : LinearLayout { @BindView(R.id.menu_title_text_view_id) lateinit var menuTitleTextView : CTextBasic constructor(ctx: Context) : super(ctx) { } init { val view = LayoutInflater.from(context).inflate(R.layout.menu_item,this) ButterKnife.bind(this,view) } constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) { val menuAttrs = context.theme.obtainStyledAttributes(attrs, R.styleable.MenuItemView, 0, 0) try { val title: String = menuAttrs.getString(R.styleable.MenuItemView_menu_title) menuTitleTextView.text = title }catch (e : Exception){ e.printStackTrace() }finally { menuAttrs.recycle() } } fun setTitle( title : String){ menuTitleTextView.text = title } } 

这是错误日志

  kotlin.UninitializedPropertyAccessException: lateinit property menuTitleTextView has not been initialized at com.leavigstone.liberali.ui.custom.menu.MenuItemView.setTitle(MenuItemView.kt:48) at com.leavigstone.liberali.ui.activities.MainActivity.onAddButtonClick(MainActivity.java:142) at com.leavigstone.liberali.ui.activities.MainActivity_ViewBinding$3.doClick(MainActivity_ViewBinding.java:54) at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22) at android.view.View.performClick(View.java:4780) at android.view.View$PerformClick.run(View.java:19866) 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:5254) 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:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Kotlin使用Kotterknife黄油刀式的视图绑定。

然后你可以绑定你的视图

 val menuTitleTextView: CTextBasic by bindView(R.id.menu_title_text_view_id) 

如果你不想使用任何第三方库,你可以添加这些扩展功能(我倾向于有一个ViewExtensions.ktViewExtensions.kt的上下文或查看相关的扩展功能),然后把它

 inline fun <reified T : View> View.find(id: Int): T = findViewById(id) as T inline fun <reified T : View> Activity.find(id: Int): T = findViewById(id) as T inline fun <reified T : View> Fragment.find(id: Int): T = view?.findViewById(id) as T 

这些让你从ActivityFragmentView调用find 。 所以在你的班级里,而不是

 @BindView(R.id.menu_title_text_view_id) lateinit var menuTitleTextView : CTextBasic 

你可以有

 val menuTitleTextView by lazy { find<CTextBasic>(R.id.menu_title_text_view_id) } 

对于像UI这样的东西,最好是val而不是var当他们不需要改变的时候。 作为编程的一般规则,尽量让事情尽可能不变,那么你的bug就会少得多。

您的初始化程序块不被调用。 只有当你的主构造函数被调用时才会调用它。 在你的情况下,当从xml布局创建视图对象时,使用辅助构造函数。

init{...}块更改为fun init(){...}并将其作为每个构造函数中的第一条语句

你忘了添加构造函数

constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

=>添加并调用init()