свойство 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) 

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

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

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

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

    Я нашел, что это работает для меня.

    Измените файл build.gradle в модуле app проекта.

     dependencies { compile "com.jakewharton:butterknife:8.8.1" kapt "com.jakewharton:butterknife-compiler:8.8.1" } 

    используйте kapt вместо annotationProcessor .

    и тогда вы можете сделать свою знакомую аннотацию ButterKnife следующим образом:

     class MainActivity : AppCompatActivity() { @BindView(R.id.myButton) lateinit var myButton: Button override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) ButterKnife.bind(this) //... } } 

    Наслаждаться.

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

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

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

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

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