2015-09-25 4 views
6

Gibt es eine Möglichkeit, eine Änderung der Ansichtssicht zu handhaben (z. B. von GONE zu VISIBLE), ohne die Sicht zu überschreiben?Behandeln Sie eine Sichtbarkeitsänderung der Ansicht, ohne die Ansicht zu überschreiben

Etwas wie View.setOnVisibilityChangeListener();?

+0

Ich weiß es nicht genau, aber ich würde sagen, dass es so etwas nicht gibt, da es eine Menge Arbeit auf das ganze System geben würde, um permanent die Sichtbarkeit aller Ansichten zu verfolgen , um einen möglichen Zuhörer zu benachrichtigen. – Ridcully

Antwort

25

Sie können GlobalLayoutListener verwenden, um festzustellen, ob Änderungen in der Sichtbarkeit der Ansichten vorhanden sind.

+1

Dies funktioniert, aber es funktioniert nur für Layoutänderungen bzw. für Änderungen von GONE nach VISIBLE und umgekehrt, da INVISIBLE keine Layoutänderung auslöst. Habe ich recht? – ToBe

+0

@ToBe in dieser Zeile myView.setTag (myView.getVisibility()); Sie können festlegen, was Sie danach behandeln möchten – Trinity

3

Statt Subklassen können Sie Dekoration verwenden:

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

} 

Dann

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

Dies ist, als würde man nur eine Hilfsklasse für die Ansicht erstellen. Die Ansicht zu überschätzen wäre meiner Meinung nach besser. Aber ja, das würde funktionieren, wenn man davon ausgeht, dass die spezifische 'setVisibility()' jedes Mal verwendet wird, wenn –

+0

@Nicolas Tyler Submitter ausdrücklich sagt "ohne die Ansicht zu überschreiben", so ist Ihre Aussage "Die Ansicht wäre besser" falsch. Außerdem führt das Überschreiben der Ansichten zu massiven XML-Änderungen. Im Allgemeinen hat Ihr Kommentar keine Bedeutung –

+0

ist nicht falsch, es ist einfach nicht das, was das OP gefragt. Das OP suchte nach einem Listener für Sichtbarkeitsänderungen. Und vorzugsweise nicht die Ansicht überschreiben. –

2

Werfen Sie einen Blick auf ViewTreeObserver.OnGlobalLayoutListener. Wie in der Dokumentation beschrieben, wird die Callback-Methode onGlobalLayout() aufgerufen, wenn sich der globale Layout-Status oder die Sichtbarkeit von Ansichten in der Ansichtsstruktur ändert. Sie können also versuchen, die Sichtbarkeit der Ansicht zu erkennen.

Verwandte Themen