親ビューにアタッチされていることを検出する必要があるビューがあります。
子ビューがいつ追加/削除されているかを知ることができるがありますが、反対のことが必要です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();
}
}
そのようなコントロールが必要な場合は、フラグメントにするのが最善かもしれないと思います。そうすれば、よりきめ細かいライフサイクルにアクセスできます。
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()
}