2012-12-28 6 views
13

Mam widok, który musi wykryć, kiedy jest dołączany do widoku nadrzędnego.W jaki sposób widok może wykryć, kiedy jest dołączany do rodzica?

Mam ViewGroup Mam OnHierarchyChangeListener, który pozwala mi wiedzieć, kiedy dziecko jest dodawane/usuwane, ale potrzebuję czegoś odwrotnego.

+0

mi, że to właśnie [onAttachedToWindow] (http://developer.android.com/reference/android/view/View.html#onAttachedToWindow()) – Blundell

+0

I odczytu o funkcja, ale nie wygląda dokładnie tak, jak potrzebuję. Z tego co rozumiem, jest wywoływana tylko wtedy, gdy widok ma się narysować, ale muszę wiedzieć, kiedy zostanie dodany do rodzica, co może nastąpić dużo wcześniej, zanim proces rysowania się zacznie. Ponadto nie jestem pewien co do zachowania tej funkcji, jeśli widok zostanie usunięty i dodany do innego elementu nadrzędnego. Czy zostanie ponownie wywołana? – user940016

+0

onDetach zostanie wywołany, a następnie onAttach, a jeśli chodzi o nadpisywanie ich i dodawanie rejestrowania siebie, aby dowiedzieć się, – Blundell

Odpowiedz

15

Można tworzyć niestandardowe widoki i robić swoje rzeczy w swoim 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(); 
    } 
} 

[EDIT 1]

można zapewnić, że CustomView dodany do skorygowania viewgroup który chcesz

@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();   
    } 

} 
+0

Ale widok nie jest dodawany do widoku nadrzędnego, gdy jest zbudowany! Chcę wiedzieć, kiedy w niektórych grupach widoków wywoływana jest funkcja addView, a ten widok jest przekazywany jako argument. – user940016

+0

Niestety masz rację, proszę spojrzeć na zredagowaną odpowiedź. – Talha

+0

Proszę zobaczyć mój komentarz powyżej. Nie jestem pewien, czy AttachedToWindow jest właściwym rozwiązaniem dla mojego problemu. – user940016

0

Cóż, masz widok w OnHierarchyChangeListener, więc przypuszczam, że możesz dodać wywołanie zwrotne do swoich widoków (poprzez podklasy za pomocą interfejsu) i nazwać je rom OnHierarchyChangeListener. W ten sposób Twoje poglądy będą wywoływane w tym samym czasie, co wywołanie OnHierarchyChangeListener.

Jednak nie będę zaskoczony, że w takim przypadku wiele właściwości poglądów, takich jak ich wymiary, może jeszcze nie zostać zdefiniowanych.

+0

Ale to ogranicza funkcjonalność tylko rodzicom, którzy ją wspierają ... – user940016

+0

Tak, oczywiście: nie jest to proces automatyczny dla rodziców. – SylvainL

0

Myślę, że jeśli potrzebujesz tego rodzaju kontroli, najlepiej jest zrobić z tego fragment. W ten sposób uzyskasz dostęp do bardziej szczegółowego cyklu życia.

0

Możesz spojrzeć na ten problem pod innym kątem, jeśli monitorujesz rodziców dla dołączonych widoków za pomocą metody implementacji onViewAdded.

przykład:

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; 
    } 
}