lateinit属性尚未初始化

时间:2016-10-21 11:54:55

标签: android kotlin butterknife

我有一个自定义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);
            }
        });
    }

8 个答案:

答案 0 :(得分:6)

如果您不想使用任何第三方库,您可以添加这些扩展功能(我倾向于有ContextExtensions.ktViewExtensions.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

这些可让您从findActivityFragment内拨打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()