Wie und warum Android Visibility Listener verwendet werden

Die Android-Benutzeroberfläche besteht aus Ansichten, und in einer regulären Anwendung gibt es normalerweise mehrere davon. Um herauszufinden, welche Ansicht der Benutzer gerade betrachtet, müssen Sie Visibility Listener installieren .

Lesen Sie unten, um mehr über die verschiedenen Optionen zu erfahren, mit denen Sie den Sichtbarkeitsstatus einer Ansicht ermitteln können.

So werden Sie sichtbar

Damit unsere Listener arbeiten können, müssen wir zunächst sicherstellen, dass unsere Ansicht in der Layouthierarchie gefunden wird. Dies geschieht auf zwei Arten:

  1. Ihre Ansicht ist bereits Teil Ihres Layouts, wie es in einer XML-Datei definiert ist
  2. Sie haben eine Ansicht dynamisch erstellt und müssen sie mithilfe der addView-Methode hinzufügen
public void addView (View child, ViewGroup.LayoutParams params)

Der Sichtbarkeitsstatus einer Ansicht ist vom Typ Integer und kann eine von drei Optionen haben:

  1. SICHTBAR (0) - Die Ansicht ist für den Benutzer sichtbar
  2. UNSICHTBAR (4) - Die Ansicht ist für den Benutzer unsichtbar, nimmt jedoch weiterhin Platz im Layout ein
  3. GONE (8) - Die Ansicht ist unsichtbar und nimmt keinen Platz im Layout ein

Sobald wir uns in unserer Layouthierarchie befinden, gibt es einige native Optionen, mit denen wir feststellen können, wann sich die Sichtbarkeit unserer Ansicht geändert hat.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

Diese Methode wird ausgelöst, wenn sich die Sichtbarkeit der Ansicht oder eines Vorfahren der Ansicht geändert hat. Der Status der Sichtbarkeit befindet sich im Sichtbarkeitsparameter.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

Diese Methode wird ausgelöst, wenn das enthaltene Fenster unserer Ansicht seine Sichtbarkeit geändert hat. Dies garantiert nicht, dass das Fenster, in dem sich Ihre Ansicht befindet, für den Benutzer sichtbar ist, da es möglicherweise durch ein anderes Fenster verdeckt wird.

Sichtbarkeit Listener in Aktion

Um diese beiden Listener in Aktion zu sehen, erstellen wir ein einfaches Projekt. Wir werden ein LinearLayout mit einer Textansicht und einer Schaltfläche haben. Durch Klicken auf die Schaltfläche der Schaltfläche wird dem Layout unsere benutzerdefinierte Ansicht hinzugefügt.

Unsere benutzerdefinierte Ansicht:

package com.tomerpacific.viewvisibility; import android.content.Context; import android.graphics.Color; import android.util.Log; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import static android.view.Gravity.CENTER; public class MyCustomView extends LinearLayout { private final String TAG = MyCustomView.class.getSimpleName(); public MyCustomView(Context context) { super(context); this.setBackgroundColor(Color.GREEN); this.setGravity(CENTER); TextView myTextView = new TextView(context); myTextView.setText("My Custom View"); addView(myTextView); } @Override public void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); Log.d(TAG, "View " + changedView + " changed visibility to " + visibility); } @Override public void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); Log.d(TAG, "Window visibility changed to " + visibility); } }

Und schließlich der Code in unserer MainActivity:

package com.tomerpacific.viewvisibility; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; public class MainActivity extends AppCompatActivity { private Button addCustomViewBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); addCustomViewBtn = (Button) findViewById(R.id.addCustomViewBtn); addCustomViewBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { LinearLayout mainLayout = (LinearLayout) findViewById(R.id.mainLayout); MyCustomView myCustomView = new MyCustomView(getApplicationContext()); myCustomView.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)); mainLayout.addView(myCustomView); } }); } }

Wenn wir die Anwendung ausführen und den Knopf drücken, erhalten wir:

//giphy.com/gifs/8JZA6Djt7DmYpEXj2h/html5

Das Beispielprojekt erhalten Sie hier.

ViewTreeObserver

Dies ist ein natives Objekt mit einer Vielzahl von Listenern, die über verschiedene Änderungen der Sichtbarkeit des Ansichtsbaums informiert werden. Einige prominente zu beachten sind:

  • OnGlobalLayoutListener
  • OnWindowAttachListener
  • OnWindowFocusChangeListener

Um einen ViewTreeObserver anzuhängen, müssen Sie Folgendes tun:

LinearLayout linearLayout = (LinearLayout) findViewById(R.id.YOUR_VIEW_ID); ViewTreeObserver viewTreeObserver = linearLayout.getViewTreeObserver(); viewTreeObserver.addOnGlobalLayoutListener (new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this); //TODO Add Logic } });

Die Linie linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)stellt sicher, dass der Listener nur einmal angerufen wird. Wenn Sie Änderungen weiterhin abhören möchten, entfernen Sie sie.

Wenn Sie Kommentare oder Vorschläge haben, können Sie mich gerne informieren.