Kuinka ja miksi käyttää Android-näkyvyyskuuntelijoita
Android-käyttöliittymä on rakennettu Viewsista, ja tavallisessa sovelluksessa niitä on yleensä useita. Jos haluat selvittää, mitä näkymää käyttäjä parhaillaan tarkastaa, sinun on asennettava Visibility Listeners .
Alla on lisätietoja eri vaihtoehdoista, joita sinulla on näkymän näkyvyyden tilan tunnistamiseksi.
Kuinka tulla näkyväksi
Jotta kuuntelijamme voisivat työskennellä, meidän on ensin varmistettava, että näkymämme löytyy asetteluhierarkiassa. Tätä tapahtuu kahdella tavalla:
- Näkymä on jo osa ulkoasua, koska se on määritelty XML-tiedostossa
- Loit näkymän dynaamisesti, ja sinun on lisättävä se käyttämällä addView-menetelmää
public void addView (View child, ViewGroup.LayoutParams params)
Näkymän näkyvyyden tila on kokonaisluku ja sillä voi olla yksi kolmesta vaihtoehdosta:
- NÄKYVÄ (0) - Näkymä näkyy käyttäjälle
- NÄKYMÄTÖN (4) - Näkymä on käyttäjälle näkymätön, mutta vie silti tilaa asettelussa
- GONE (8) - Näkymä on näkymätön, eikä se vie tilaa asettelussa
Asetteluhierarkian sisällä on muutama natiivivaihtoehto, joiden avulla voimme tietää, kun Näkymämme näkyvyys on muuttunut.
onVisibilityChanged
protected void onVisibilityChanged (View changedView, int visibility)
Tämä menetelmä laukaistaan, kun näkymän tai sen esi-isän näkyvyys on muuttunut. Näkyvyyden tila löytyy näkyvyysparametrista.
onWindowVisibilityChanged
protected void onWindowVisibilityChanged (int visibility)
Tämä menetelmä käynnistetään, kun näkymän sisältävä ikkuna on muuttanut näkyvyyttä. Tämä ei takaa, että ikkuna, jossa näkymäsi on, näkyy käyttäjälle, koska toinen ikkuna saattaa peittää sen.
Näkyvyyskuuntelijat toiminnassa
Luo yksinkertainen projekti nähdäksesi nämä kaksi kuuntelijaa toiminnassa. Meillä on LinearLayout, jossa on TextView ja painike. Teemme painikkeen napsautustoiminnon lisäämään mukautetun näkymämme asetteluun.

Mukautettu näkymä:
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); } }
Ja lopuksi MainActivity-koodimme:
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); } }); } }
Kun suoritamme sovelluksen ja painamme painiketta, saat:
//giphy.com/gifs/8JZA6Djt7DmYpEXj2h/html5
Voit saada malliprojektin täältä.
ViewTreeObserver
Tämä on natiiviobjekti, jolla on laaja joukko kuuntelijoita, joille ilmoitetaan näkymän puun erilaisista näkyvyyden muutoksista. Joitakin merkittäviä huomioitavia ovat:
- OnGlobalLayoutListener
- OnWindowAttachListener
- OnWindowFocusChangeListener
ViewTreeObserver voidaan liittää seuraavasti:
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 } });
Linja linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)
varmistaa, että kuuntelijalle soitetaan vain kerran. Jos haluat jatkaa muutosten kuuntelua, poista se.
Jos sinulla on kommentteja tai ehdotuksia, ota rohkeasti yhteyttä.