Kako i zašto koristiti Android slušatelje vidljivosti

Korisničko sučelje za Android izgrađeno je od Views, a u redovnoj aplikaciji obično ih je nekoliko. Da biste saznali koji prikaz korisnik trenutno gleda, morate instalirati slušatelje vidljivosti .

Pročitajte u nastavku da biste saznali o različitim opcijama koje su vam potrebne za prepoznavanje statusa vidljivosti pogleda.

Kako postati vidljiv

Da bi naši slušatelji mogli raditi, prvo moramo biti sigurni da se naš pogled nalazi u hijerarhiji izgleda. Postoje dva načina da se to dogodi:

  1. Vaš je pogled već dio vašeg izgleda, kako je definiran u XML datoteci
  2. Dinamički ste stvorili prikaz i morate ga dodati metodom addView
public void addView (View child, ViewGroup.LayoutParams params)

Status vidljivosti prikaza je vrste Integer i može imati jednu od tri mogućnosti:

  1. VIDLJIVO (0) - Pogled je vidljiv korisniku
  2. NEVIDLJIV (4) - Pogled je nevidljiv korisniku, ali svejedno zauzima prostor na izgledu
  3. NESTALO (8) - Pogled je nevidljiv i ne zauzima prostor na izgledu

Kad uđemo u našu hijerarhiju rasporeda, postoji nekoliko izvornih opcija koje će nam pomoći da znamo kada se vidljivost našeg pogleda promijenila.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

Ova se metoda aktivira kada se promijeni vidljivost pogleda ili pretka pogleda. Status vidljivosti nalazi se unutar parametra vidljivosti.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

Ova se metoda aktivira kada je prozor s prikazom našeg pogleda promijenio vidljivost. To ne garantira da je prozor u kojem se nalazi vaš pogled vidljiv korisniku, jer ga drugi prozor može zakloniti.

Slušatelji vidljivosti na djelu

Da bismo vidjeli ovo dvoje slušatelja na djelu, napravimo jednostavan projekt. Imat ćemo LinearLayout s TextViewom i gumbom. Napravit ćemo da gumb za klik klik doda naš prilagođeni prikaz u izgled.

Naš prilagođeni pogled:

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

I na kraju, kod u našoj 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); } }); } }

Kad pokrenemo aplikaciju i pritisnemo gumb, dobit ćemo:

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

Uzorak projekta možete dobiti ovdje.

ViewTreeObserver

Ovo je izvorni objekt koji ima širok raspon slušatelja koji su obaviješteni o raznim promjenama vidljivosti na stablu prikaza. Neki istaknuti koji treba primijetiti su:

  • OnGlobalLayoutListener
  • OnWindowAttachListener
  • OnWindowFocusChangeListener

Da biste priključili ViewTreeObserver, trebate učiniti sljedeće:

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

Crta linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)osigurava da će slušatelja nazvati samo jednom. Ako želite i dalje slušati promjene, uklonite ih.

Ako imate bilo kakvih komentara ili prijedloga, slobodno mi javite.