Android 视图在';它和它的父母有联系吗?
我有一个视图需要检测它何时被附加到其父视图Android 视图在';它和它的父母有联系吗?,android,android-layout,android-view,Android,Android Layout,Android View,我有一个视图需要检测它何时被附加到其父视图 在视图组中我有OnHierarchyChangeListener,它允许我知道何时添加/删除子视图,但我需要相反的东西。您可以创建自定义视图,并在其onAttachedToWindow中执行您的操作 public class CustomView extends View { public CustomView(Context context) { super(context); } @Override pro
在
视图组中
我有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]
您可以确保将customview添加到所需的正确视图组中
@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();
}
}
好的,您在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
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
}
});
我以为这只是我读到的功能,但它似乎并不完全像我需要的。据我所知,仅当视图即将绘制自身时才调用它,但我必须知道它何时添加到父对象,这可能在绘制过程开始之前发生。此外,如果视图被删除并添加到另一个父级,我不确定该函数的行为。是否再次调用它?将调用OnDeach,然后调用OnAtach,如何覆盖它们并添加日志记录以查找的可能的副本,但在构建视图时不会将视图添加到父视图中!我想知道何时在某个视图组上调用addView,并将此视图作为参数传递。请参阅我上面的评论。我不确定onAttachedToWindow是否是我的问题的正确解决方案。对于您的问题,您还应该控制家长,您可以查看编辑的答案是的,当然:对于家长来说,这不是一个自动过程。