Comment et pourquoi utiliser les écouteurs de visibilité Android

L'interface utilisateur Android est construite à partir de Views, et dans une application classique, il y en a généralement plusieurs. Pour savoir quelle vue l'utilisateur regarde actuellement, vous devez installer des écouteurs de visibilité .

Lisez ci-dessous pour découvrir les différentes options dont vous disposez pour identifier l'état de visibilité d'une vue.

Comment devenir visible

Pour que nos écouteurs fonctionnent, nous devons d'abord nous assurer que notre vue se trouve dans la hiérarchie de mise en page. Cela se produit de deux manières:

  1. Votre vue fait déjà partie de votre mise en page telle qu'elle est définie dans un fichier XML
  2. Vous avez créé une vue de manière dynamique et vous devez l'ajouter à l'aide de la méthode addView
public void addView (View child, ViewGroup.LayoutParams params)

Le statut de visibilité d'une vue est de type Integer et peut avoir l'une des trois options suivantes:

  1. VISIBLE (0) - La vue est visible par l'utilisateur
  2. INVISIBLE (4) - La vue est invisible pour l'utilisateur, mais prend toujours de la place dans la mise en page
  3. GONE (8) - La vue est invisible et ne prend pas de place dans la mise en page

Une fois dans notre hiérarchie de mise en page, il existe quelques options natives pour nous aider à savoir quand la visibilité de notre vue a changé.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

Cette méthode est déclenchée lorsque la visibilité de la vue ou d'un ancêtre de la vue a changé. Le statut de la visibilité se trouve dans le paramètre de visibilité.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

Cette méthode est déclenchée lorsque la fenêtre contenant de notre vue a changé sa visibilité. Cela ne garantit pas que la fenêtre dans laquelle se trouve votre vue est visible pour l'utilisateur, car elle peut être masquée par une autre fenêtre.

Auditeurs de visibilité en action

Pour voir ces deux auditeurs en action, créons un projet simple. Nous aurons un LinearLayout avec un TextView et un bouton. Nous allons faire en sorte que l'action de clic du bouton ajoute notre vue personnalisée à la mise en page.

Notre vision personnalisée:

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

Et enfin, le code dans notre 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); } }); } }

Lorsque nous exécutons l'application et que nous appuyons sur le bouton, nous obtenons:

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

Vous pouvez obtenir l'exemple de projet ici.

ViewTreeObserver

Il s'agit d'un objet natif qui possède un large éventail d'écouteurs qui sont notifiés de divers changements de visibilité dans l'arborescence de vues. Certains des plus importants à prendre en compte sont:

  • OnGlobalLayoutListener
  • OnWindowAttachListener
  • OnWindowFocusChangeListener

Pour attacher un ViewTreeObserver, vous devez effectuer les opérations suivantes:

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

La ligne linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)s'assure que l'auditeur ne sera appelé qu'une seule fois. Si vous souhaitez continuer à écouter les modifications, supprimez-le.

Si vous avez des commentaires ou des suggestions, n'hésitez pas à me le faire savoir.