Butterknife定制视图解开

时间:2016-04-22 13:14:26

标签: android android-view butterknife

呼叫的最佳做法是什么: -

Butterknife.unbind()

在自定义Android视图中请?

4 个答案:

答案 0 :(得分:21)

是的,onDetachedFromWindowNJ's answer中提到的正确功能,因为这是视图不再具有绘图表面的地方。

但答案中错误地提到了用法。正确的方法涉及onFinishInflate()

中的约束
@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    unbinder = ButterKnife.bind(this);
}

并在onDetachedFromWindow中取消绑定:

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    // View is now detached, and about to be destroyed
    unbinder.unbind();
}

答案 1 :(得分:9)

试试onDetachedFromWindow()

Unbinder unbinder;
unbinder = Butterknife.bind(this, root);

并在onDetachedFromWindow中,您需要致电unbinder.unbind();

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    // View is now detached, and about to be destroyed
   unbinder.unbind()
}

答案 2 :(得分:0)

警告!

如果您在XML中使用app:attribute="value"设置属性,则在阅读时会丢失其值:

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    unbinder = ButterKnife.bind(this);

    TypedValue typedValue = new TypedValue();
    TypedArray typedArray = getContext().obtainStyledAttributes(typedValue.data, R.styleable.YourStyleable);
    try {
        int number = typedArray.getResourceId(R.styleable.YourStyleable_number, 0);
        image.setImageResource(number);

        String text = typedArray.getString(R.styleable.YourStyleable_text);
        text.setText(text);
    } finally {
        typedArray.recycle();
    }
}

它们的值将为0且为null。在自定义视图的构造函数中初始化它们。

原因是使用obtainStyledAttributes(typedValue.data而不是obtainStyledAttributes(attrs

请参阅:Magic with obtainStyledAttributes method

答案 3 :(得分:0)

onDetachedFromWindow并不总是起作用,就像自定义视图在RecyclerView中一样。加上实际上实际上使我的应用程序崩溃了。老实说,它可以正常工作而不会解除绑定。