2016-10-21 4 views
11

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

ножа для масла

это мой Котлин класс

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) 

ответ

1

Использование Kotterknife для Butter Knife-esque View Binding для Kotlin.

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

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

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

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

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

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

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

+0

Когда я использую это (ctx), он говорит Выражение 'this' типа 'MenuItemView' не может быть вызвано как функция. Функция 'invoke()' не найдена –

+0

Я отредактировал мой ответ – lukle

+0

спасибо, но та же ошибка:/ –

4

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

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

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

0

Я нашел this работает для меня.

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

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

использование kapt вместо annotationProcessor.

, а затем вы можете сделать ваш знакомый нож для масла аннотаций, как это:

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) 
     //... 
    } 
} 

Наслаждайтесь.

Смежные вопросы