我有一个视图需要检测它何时附加到其父视图。
在一个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.addOnAttachStateChangeListener在视图附加到视图层次结构以及从视图层次结构分离时获取挂钩。
就像是:
科特林
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
}
})
爪哇
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
}
});
好吧,您在 OnHierarchyChangeListener 中有视图,所以我想您可以向视图添加一个回调(通过使用接口对它们进行子类化)并从 OnHierarchyChangeListener 调用它。这样,您的视图将在调用 OnHierarchyChangeListener 的同时被调用。
但是,当这种情况发生时,您的视图的许多属性(例如它们的尺寸)可能尚未定义,我不会感到惊讶。
我认为如果您需要这种控制,最好将其设为片段。这样您就可以访问更精细的生命周期。
如果您通过实现方法 onViewAdded 监视父视图的附加视图,则可以从不同的角度看待这个问题。
例子:
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;
}
}
如果您使用的是kotlin,则可以doOnAttach
在View
.
view.doOnAttach {
// TODO: Your view has a parent, you can use it now.
(view.parent as ViewGroup)?.yourAction()
}