2015-09-25 9 views
6

C'è un modo per gestire una modifica della visibilità della vista (diciamo, da GONE a VISIBLE) senza sovrascrivere la vista?Gestire una modifica della visibilità della vista senza sovrascrivere la vista

Qualcosa come View.setOnVisibilityChangeListener();?

+0

Non lo so per certo, ma direi che non c'è una cosa del genere, in quanto metterebbe un sacco di lavoro su tutto il sistema per tracciare in modo permanente la visibilità di tutti i punti di vista in ogni momento , al fine di notificare un possibile ascoltatore. – Ridcully

risposta

25

È possibile utilizzare un GlobalLayoutListener per determinare se sono presenti modifiche nella visibilità delle viste.

myView.setTag(myView.getVisibility()); 
myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     int newVis = myView.getVisibility(); 
     if((int)myView.getTag() != newVis) 
     { 
      myView.setTag(myView.getVisibility()); 
      //visibility has changed 
     } 
    } 
}); 
+1

Funziona ma funziona solo per le modifiche al layout rispettivamente per le modifiche da GONE a VISIBLE e viceversa perché INVISIBLE non attiva una modifica del layout. Ho ragione? – ToBe

+0

@ToBe in questa riga myView.setTag (myView.getVisibility()); è possibile impostare qualsiasi cosa si desidera gestire in seguito – Trinity

3

Invece di sottoclassi è possibile utilizzare la decorazione:

class WatchedView { 
    static class Listener { 
    void onVisibilityChanged(int visibility); 
    } 

private View v; 
private Listener listener; 
    WatchedView(View v) { 
    this.v = v; 
    } 

void setListener(Listener l) { 
    this.listener = l; 
} 

    public setVisibility(int visibility) { 
    v.setVisibility(visibility); 
    if(listener != null) { 
     listener.onVisibilityChanged(visibility); 
    } 
    } 

} 

Poi

WatchedView v = new WatchedView(findViewById(R.id.myview)); 
v.setListener(this); 
+0

Questo è come creare una classe helper per la vista. Ignorare la vista sarebbe meglio di questo a mio parere. Ma sì, funzionerebbe, assumendo che ogni volta sia usato lo specifico 'setVisibility()' –

+0

@Nicolas Tyler Submitter ha detto espressamente "senza sovrascrivere la vista" quindi la tua affermazione "Sovrascrivere la vista sarebbe migliore" è falsa. Inoltre, sovrascrivere le viste provocherà enormi modifiche xml. In generale il tuo commento è privo di significato –

+0

non è falso, non è proprio quello che l'OP chiedeva. L'OP stava cercando un ascoltatore per le modifiche alla visibilità. E preferibilmente non dover scavalcare la vista. –

2

Date un'occhiata a ViewTreeObserver.OnGlobalLayoutListener. Come scritto nella documentazione, il suo metodo di callback onGlobalLayout() viene richiamato quando lo stato del layout globale o la visibilità delle viste all'interno dell'albero della vista cambia. Quindi puoi provare a utilizzarlo per rilevare quando cambia la visibilità della vista.

Problemi correlati