【发布时间】:2016-04-22 13:14:26
【问题描述】:
打电话的最佳做法是什么:-
Butterknife.unbind()
请在自定义 Android 视图中?
【问题讨论】:
标签: android android-view butterknife
打电话的最佳做法是什么:-
Butterknife.unbind()
请在自定义 Android 视图中?
【问题讨论】:
标签: android android-view butterknife
是的,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();
}
【讨论】:
onDestroyView(); stackoverflow.com/a/26370042/1307690 @WahibUlHaq 中取消视图我不知道你是否必须在onDetachedFromView() 中执行此操作,因为此时您的自定义视图将还不是 null,如果你在 unbind 后尝试改变它的子元素,你会得到 NullPointerException
试试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 的一部分)。
onDetachedFromWindow 并不总是有效,就像自定义视图在 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。
【讨论】: