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:
- Tampilan Anda sudah menjadi bagian dari tata letak Anda seperti yang ditentukan dalam file XML
- 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:
- TERLIHAT (0) - Tampilan dapat dilihat oleh pengguna
- INVISIBLE (4) - Tampilan tidak terlihat oleh pengguna, tetapi masih membutuhkan ruang di tata letak
- 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.