Как можно определить вид, когда он привязан к его родительскому объекту?
У меня есть представление, которое нужно обнаружить, когда оно привязано к его родительскому представлению.
В ViewGroup
у меня есть OnHierarchyChangeListener
, который позволяет мне знать, когда дочерний вид добавляется/удаляется, но мне нужно другое дело.
Ответы
Ответ 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;
}
}