我有一个视图,需要检测它是否已被连接到其父视图。
在一个 ViewGroup
中,我有 OnHierarchyChangeListener
,它允许我知道何时添加/移除子视图,但我需要相反的功能。
我有一个视图,需要检测它是否已被连接到其父视图。
在一个 ViewGroup
中,我有 OnHierarchyChangeListener
,它允许我知道何时添加/移除子视图,但我需要相反的功能。
你可以创建自定义视图并在其onAttachedToWindow中执行操作
public class CustomView extends View {
public CustomView(Context context) {
super(context);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
Log.d("CustomView", "onAttachedToWindow called for " + getId());
Toast.makeText(getContext(), "added", 1000).show();
}
}
[编辑 1]
您可以确保将自定义视图添加到您想要的正确视图组中
@Override
protected void onAttachedToWindow() {
// TODO Auto-generated method stub
super.onAttachedToWindow();
if(((View)getParent()).getId()== R.id.relativelayout2)
{
Log.d("CustomView","onAttachedToWindow called for " + getId());
Toast.makeText(context, "added", 1000).show();
}
}
View
上使用 doOnAttach
扩展函数。 view.doOnAttach {
// TODO: Your view has a parent, you can use it now.
(view.parent as ViewGroup)?.yourAction()
}
无需创建自定义视图的解决方案
如果您不能或不想修改视图,则可以使用View.addOnAttachStateChangeListener 在视图附加到视图层次结构和从视图层次结构分离时获取钩子。
类似于以下内容:
Kotlin
view.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
override fun onViewAttachedToWindow(v: View) {
// Do stuff when view has been attached to window
}
override fun onViewDetachedFromWindow(v: View) {
// Do stuff when view has been detached from window
}
})
Java
view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
// Do stuff when view has been attached to window
}
@Override
public void onViewDetachedFromWindow(View v) {
// Do stuff when view has been detached from window
}
});
public class LayoutInvokeChildAdded extends RelativeLayout {
private OnDoneListener onDoneListener;
public LayoutInvokeChildAdded(Context context) {
super(context);
}
public LayoutInvokeChildAdded(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LayoutInvokeChildAdded(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void onViewAdded(View child) {
super.onViewAdded(child);
if (onDoneListener != null)
onDoneListener.onDone(childe);
}
public void setOnDoneListener(OnDoneListener onDoneListener) {
this.onDoneListener = onDoneListener;
}
}
嗯,你在OnHierarchyChangeListener中有视图,所以我想你可以通过使用接口对视图进行子类化并从OnHierarchyChangeListener调用它来添加回调。这样,当OnHierarchyChangeListener被调用时,你的视图也将被同时调用。
然而,当这种情况发生时,你的视图的许多属性,如它们的尺寸可能尚未定义,这一点不足为奇。
我认为,如果您需要那种控制,最好将其作为一个片段。这样,您就可以访问更精细的生命周期。