呼叫的最佳做法是什么: -
Butterknife.unbind()
在自定义Android视图中请?
答案 0 :(得分:21)
是的,onDetachedFromWindow
是NJ'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
。
答案 3 :(得分:0)
onDetachedFromWindow
并不总是起作用,就像自定义视图在RecyclerView
中一样。加上实际上实际上使我的应用程序崩溃了。老实说,它可以正常工作而不会解除绑定。