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.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
这些让你从Activity
, Fragment
和View
调用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()
- Android的Kotlin错误:“返回类型是”单位“这不是被覆盖的子类型”
- kotlin +特浓咖啡:找不到活动
- 应用; 曾经使用过不同的AppComponent; 在预先验证期间
- android gradle build:生成的类列表不存在
- 不寻常的崩溃只有在一些设备 – 异步调用kotlin协同程序
- 在Android Studio中使用Kotlin的多个相关XML文件的装订图标
- 使用IntelliJ的Gluon / JavaFXPorts的Android应用程序 – Android设置不完整
- 尝试使用Android Studio生成Kotlin应用程序的问题
- Kotlin kapt和android构架组件失败