2012-12-28 6 views
13

Ho una vista che deve rilevare quando viene collegata alla sua vista genitore.Come può una vista rilevare quando è collegata al genitore?

In un ViewGroup ho il OnHierarchyChangeListener che mi consente di sapere quando viene aggiunta/rimossa una vista secondaria, ma ho bisogno del contrario.

+0

ho pensato che fosse solo [onAttachedToWindow] (http://developer.android.com/reference/android/view/View.html#onAttachedToWindow()) – Blundell

+0

Ho letto che il funzione, ma non sembra esattamente quello di cui ho bisogno. Da quello che ho capito, si chiama solo quando la vista sta per disegnare se stessa, ma devo sapere quando viene aggiunta a un genitore, cosa che può verificarsi molto prima che inizi anche il processo di disegno. Inoltre, non sono sicuro del comportamento di questa funzione se la vista viene rimossa e aggiunta a un altro genitore. Viene chiamato di nuovo? – user940016

+0

onDetach verrà chiamato, quindi onAttach, che ne dici di sovrascriverli e aggiungere la registrazione per scoprire – Blundell

risposta

15

È possibile creare visualizzazione personalizzata e fare le tue cose nella sua 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]

è possibile garantire che il vostro CustomView aggiunto per correggere viewgroup cui si desidera

@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

Ma una vista non viene aggiunta a una vista genitoriale quando è costruita! Voglio sapere quando addView viene chiamato su qualche gruppo di vista con questa vista passata come argomento. – user940016

+0

Mi spiace, hai ragione, guarda la risposta modificata. – Talha

+0

Si prega di vedere il mio commento sopra. Non sono sicuro che su AttachedToWindow sia la soluzione giusta per il mio problema. – user940016

0

Bene, hai la vista in OnHierarchyChangeListener, quindi suppongo che tu possa aggiungere una callback alle tue viste (sottoclassandole con un'interfaccia) e chiamarla f rom OnHierarchyChangeListener. In questo modo, le tue viste verranno chiamate nello stesso momento in cui viene chiamato OnHierarchyChangeListener.

Tuttavia, non mi sorprenderà che quando ciò accade, molte proprietà delle viste come le loro dimensioni potrebbero non essere ancora definite.

+0

Ma questo limita la funzionalità solo ai genitori che lo supportano ... – user940016

+0

Sì, certo: non è un processo automatico per i genitori. – SylvainL

0

Penso che se avete bisogno di quel tipo di controllo potrebbe essere meglio renderlo un frammento. In questo modo avrai accesso a un ciclo di vita molto più granulare.

0

È possibile esaminare questo problema in un'angolazione diversa, se si monitorano i genitori per le viste associate mediante l'implementazione del metodo suViewAdded.

Esempio:

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