Как можно определить, когда оно привязано к его родительскому объекту?

У меня есть представление, которое нужно обнаружить, когда оно привязано к его родительскому представлению.

В ViewGroup меня есть OnHierarchyChangeListener который позволяет мне знать, когда дочерний вид добавляется / удаляется, но мне нужно другое.

Solutions Collecting From Web of "Как можно определить, когда оно привязано к его родительскому объекту?"

Вы можете создать пользовательский вид и сделать свой материал в 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; } }