调用的最佳实践是什么:-
Butterknife.unbind()
在自定义的Android视图中怎么做?调用的最佳实践是什么:-
Butterknife.unbind()
在自定义的Android视图中怎么做?是的,onDetachedFromWindow
是正确的函数,如 NJ的回答中所述,因为这是视图不再具有用于绘制的表面的地方。
但是该答案中提到的用法是不正确的。正确的方法是在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();
}
尝试在 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()
}
onDetachedFromWindow
回调不一定意味着 View
将被销毁(例如,如果它是 RecyclerView
的一部分)。 - Bartek LipinskionDetachedFromWindow
不总是有效的,例如当自定义视图位于 RecyclerView
中时。事实上,添加它实际上会导致我的应用程序崩溃。老实说,不解绑也可以正常工作。
警告!
如果您在 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
。
onDestroyView();
中将视图设置为空。https://dev59.com/W18d5IYBdhLWcg3w21Om#26370042 @WahibUlHaq 我不确定你是否需要在onDetachedFromView()
中这样做,因为此时您的自定义视图尚未为空,如果您尝试在取消绑定后更改其子项,则会出现 NullPointerException。 - Roman Nazarevych