Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

}

Ответ 2

Ну, у вас есть представление в OnHierarchyChangeListener, поэтому я бы предположил, что вы могли бы добавить обратный вызов к вашим представлениям (путем подклассификации их с помощью интерфейса) и вызвать его из OnHierarchyChangeListener. Таким образом, ваши представления будут вызываться одновременно с вызовом OnHierarchyChangeListener.

Однако я не удивлюсь, что когда это произойдет, многие свойства ваших представлений, такие как их размеры, еще не определены.

Ответ 3

Я думаю, что если вам нужен такой контроль, лучше всего сделать его фрагментом. Таким образом, вы получаете доступ к гораздо более сложному жизненному циклу.

Ответ 4

Вы можете рассматривать эту проблему под другим углом, если вы контролируете родителей для прикрепленных представлений, реализуя метод 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;
    }
}