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:

  1. Näkymä on jo osa ulkoasua, koska se on määritelty XML-tiedostossa
  2. 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:

  1. NÄKYVÄ (0) - Näkymä näkyy käyttäjälle
  2. NÄKYMÄTÖN (4) - Näkymä on käyttäjälle näkymätön, mutta vie silti tilaa asettelussa
  3. 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ä.