Bagaimana dan mengapa menggunakan Pendengar Visibilitas Android

UI Android dibangun dari Views, dan dalam aplikasi biasa, biasanya ada beberapa di antaranya. Untuk mengetahui Tampilan mana yang sedang dilihat pengguna, Anda perlu menginstal Visibility Listeners .

Baca di bawah untuk mengetahui tentang berbagai opsi yang Anda miliki untuk mengidentifikasi status visibilitas Tampilan.

Bagaimana Menjadi Terlihat

Agar pendengar kita bekerja, pertama kita harus memastikan View kita ditemukan dalam hierarki layout. Ada dua cara ini terjadi:

  1. Tampilan Anda sudah menjadi bagian dari tata letak Anda seperti yang ditentukan dalam file XML
  2. Anda membuat View secara dinamis, dan Anda perlu menambahkannya menggunakan metode addView
public void addView (View child, ViewGroup.LayoutParams params)

Status visibilitas View adalah tipe Integer dan dapat memiliki salah satu dari tiga opsi:

  1. TERLIHAT (0) - Tampilan dapat dilihat oleh pengguna
  2. INVISIBLE (4) - Tampilan tidak terlihat oleh pengguna, tetapi masih membutuhkan ruang di tata letak
  3. GONE (8) - Tampilan tidak terlihat, dan tidak memakan ruang di tata letak

Setelah berada di dalam hierarki tata letak kami, ada beberapa opsi asli untuk membantu kami mengetahui saat visibilitas Tampilan kami telah berubah.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

Metode ini dipicu saat visibilitas tampilan atau nenek moyang tampilan telah berubah. Status visibilitas ditemukan di dalam parameter visibilitas.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

Metode ini dipicu ketika jendela yang berisi Tampilan kami telah mengubah visibilitasnya. Ini tidak menjamin bahwa jendela Tampilan Anda dapat dilihat oleh pengguna, karena mungkin terhalang oleh jendela lain.

Visibilitas Pendengar Beraksi

Untuk melihat kedua pendengar ini beraksi, mari kita buat proyek sederhana. Kami akan memiliki LinearLayout dengan TextView dan tombol. Kami akan membuat tombol di tindakan klik menambahkan tampilan kustom kami ke tata letak.

Tampilan kustom kami:

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

Dan terakhir, kode di MainActivity kita:

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

Saat kami menjalankan aplikasi dan menekan tombol, kami mendapatkan:

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

Anda bisa mendapatkan proyek sampel di sini.

ViewTreeObserver

Ini adalah objek asli yang memiliki berbagai macam pendengar yang diberi tahu tentang berbagai perubahan visibilitas ke pohon tampilan. Beberapa yang menonjol untuk diperhatikan adalah:

  • OnGlobalLayoutListener
  • OnWindowAttachListener
  • OnWindowFocusChangeListener

Untuk melampirkan ViewTreeObserver, Anda perlu melakukan hal berikut:

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

Garis linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)memastikan bahwa pendengar hanya akan dipanggil sekali. Jika Anda ingin terus mendengarkan perubahan, hapus.

Jika Anda memiliki komentar atau saran, silakan beri tahu saya.