15

我有一个视图需要检测它何时附加到其父视图。

在一个ViewGroup我有OnHierarchyChangeListener它可以让我知道何时添加/删除子视图,但我需要相反的东西。

4

6 回答 6

18

您可以创建自定义视图并在其 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();          
    }

}
于 2012-12-28T11:21:00.923 回答
2

无需创建自定义视图的解决方案

如果视图是您不能或不想修改的视图,您可以使用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
  }
});
于 2020-11-05T18:49:21.970 回答
0

好吧,您在 OnHierarchyChangeListener 中有视图,所以我想您可以向视图添加一个回调(通过使用接口对它们进行子类化)并从 OnHierarchyChangeListener 调用它。这样,您的视图将在调用 OnHierarchyChangeListener 的同时被调用。

但是,当这种情况发生时,您的视图的许多属性(例如它们的尺寸)可能尚未定义,我不会感到惊讶。

于 2012-12-28T12:54:54.407 回答
0

我认为如果您需要这种控制,最好将其设为片段。这样您就可以访问更精细的生命周期。

于 2016-09-21T14:27:31.670 回答
0

如果您通过实现方法 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;
    }
}
于 2016-10-21T21:29:27.777 回答
0

如果您使用的是kotlin,则可以doOnAttachView.

    view.doOnAttach {
        // TODO: Your view has a parent, you can use it now.
        (view.parent as ViewGroup)?.yourAction()
    }
于 2021-09-08T08:00:19.170 回答