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是否是我的问题的正确解决方案。对于您的问题,您还应该控制家长,您可以查看编辑的答案是的,当然:对于家长来说,这不是一个自动过程。