Свойство lateinit не было инициализировано

У меня есть пользовательский класс linearlayout, и когда я хочу создать экземпляр этого класса, я получил ошибку. Свойство lateinit не было инициализировано. Я использую последнюю версию библиотеки butterknife

Это мой класс kotlin

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) 

Solutions Collecting From Web of "Свойство lateinit не было инициализировано"

Используйте Kotterknife для Butter Knife-esque View Binding для Kotlin.

Затем вы можете связать свой вид с

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

Если вы не хотите использовать какие-либо библиотеки третьих сторон, вы можете добавить эти функции расширения (я имею тенденцию иметь ContextExtensions.kt или ViewExtensions.kt для контекста или ViewExtensions.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 

Они позволяют вам называть find изнутри Activity , Fragment и View s. Поэтому внутри вашего класса вместо

 @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) } 

Для таких вещей, как пользовательские интерфейсы, лучше использовать val вместо var так как вы не хотите меняться. Как правило, в программировании старайтесь держать вещи как можно более неизменными, вы получите гораздо меньше ошибок.

Ваш блок инициализатора не вызывается. Он вызывается только при вызове основного конструктора. В вашем случае вторичный конструктор используется, когда объекты вида создаются из макетов xml.

Измените блок init{...} на fun init(){...} и назовите его как первый оператор в каждом конструкторе

Вы забыли добавить конструктор

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

=> Добавьте его и вызовите init() в нем