我有一个自定义linearlayout类,当我想创建此类的实例时,我收到错误 lateinit属性尚未初始化 我使用的是最新版的butterknife库
这是我的kotlin课程
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)
这是错误日志
public void changeColor(final TextView textView, final int color) {
textView.post(new Runnable() {
@Override
public void run() {
textView.setBackgroundColor(color);
}
});
}
答案 0 :(得分:6)
如果您不想使用任何第三方库,您可以添加这些扩展功能(我倾向于有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
。
所以在你的班级而不是
@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
当他们不需要改变时,情况会更好。作为编程的一般规则,尽量使事物尽可能不变,你会得到更少的错误。
答案 1 :(得分:2)
将Kotterknife用于Kotlin的Butter Knife-esque View Binding。
然后您可以使用
绑定视图val menuTitleTextView: CTextBasic by bindView(R.id.menu_title_text_view_id)
答案 2 :(得分:2)
我发现this对我有用。
更改项目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)
//...
}
}
享受。
答案 3 :(得分:2)
在我的情况下,我没有正确构建ButterKnife。确保在模块的build.gradle中导入其编译器:
...
// Butter Knife
implementation "com.jakewharton:butterknife:$butterKnifeVersion"
kapt "com.jakewharton:butterknife-compiler:$butterKnifeVersion"
...
Jetbrain的样本线程的discussion为我提供了更多关于这个问题的信息。
另一个问题是,在创建容器之前,您可能正在访问视图。这是一个related question,讨论特定于kotlinx合成属性,但同样的逻辑应该适用于Butterknife视图绑定
答案 4 :(得分:2)
将apply plugin: 'kotlin-kapt'
添加到应用程序级别的build.gradle文件
示例
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
以及“依赖项”部分
implementation "com.jakewharton:butterknife:8.8.1"
kapt "com.jakewharton:butterknife-compiler:8.8.1"
希望这会有所帮助!
答案 5 :(得分:0)
有一个小技巧,您可以使用Platform.runLater
init {
Platform.runLater {
....
}
}
答案 6 :(得分:0)
对我来说,include
多次相同布局会发生此错误
例如
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<include layout="@layout/chart_bar_layout" />
</LinearLayout>
...
<include layout="@layout/chart_bar_layout" />
因此找到并删除该行可以使应用正常运行
答案 7 :(得分:-2)
未调用初始化程序块。只有在调用主构造函数时才会调用它。在您的情况下,当从xml布局创建视图对象时,将使用辅助构造函数。
将init{...}
块更改为fun init(){...}
并将其作为每个构造函数中的第一个语句调用
您忘记添加构造函数
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
=&GT;添加它并在其中调用init()