15

親ビューにアタッチされていることを検出する必要があるビューがあります。

子ビューがいつ追加/削除されているかを知ることができるがありますが、反対のことが必要ですViewGroupOnHierarchyChangeListener

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 に答える
0

そのようなコントロールが必要な場合は、フラグメントにするのが最善かもしれないと思います。そうすれば、よりきめ細かいライフサイクルにアクセスできます。

于 2016-09-21T14:27:31.670 に答える
0

OnHierarchyChangeListener にビューがあるので、(インターフェースでビューをサブクラス化することによって) ビューにコールバックを追加し、OnHierarchyChangeListener から呼び出すことができると思います。このようにして、OnHierarchyChangeListener が呼び出されると同時にビューが呼び出されます。

ただし、これが発生した場合、ビューのディメンションなどの多くのプロパティがまだ定義されていない可能性があります。

于 2012-12-28T12:54:54.407 に答える
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を使用している場合は、doOnAttach拡張機能を使用できますView

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