Hvordan og hvorfor man bruger lyttere til Android-synlighed

Android UI er bygget op fra Views, og i en almindelig applikation er der normalt flere af dem. For at finde ud af, hvilken visning brugeren i øjeblikket ser på, skal du installere Synlighedslyttere .

Læs nedenfor for at finde ud af om de forskellige muligheder, du har til at identificere synlighedsstatus for en visning.

Sådan bliver du synlig

For at vores lyttere kan arbejde, skal vi først sørge for, at vores View findes i layouthierarkiet. Der er to måder, dette sker på:

  1. Din visning er allerede en del af dit layout, da det er defineret i en XML-fil
  2. Du oprettede en visning dynamisk, og du skal tilføje den ved hjælp af addView-metoden
public void addView (View child, ViewGroup.LayoutParams params)

En visnings synlighedsstatus er af heltalstype og kan have en af ​​tre muligheder:

  1. VISIBLE (0) - Visningen er synlig for brugeren
  2. INVISIBLE (4) - Visningen er usynlig for brugeren, men tager stadig plads i layoutet
  3. GONE (8) - Visningen er usynlig, og den optager ikke plads i layoutet

Når vi er inde i vores layouthierarki, er der et par indfødte muligheder, der hjælper os med at vide, hvornår vores udsigts synlighed er ændret.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

Denne metode udløses, når synligheden af ​​udsigten eller en forfader til udsigten er ændret. Synlighedens status findes i synlighedsparameteren.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

Denne metode udløses, når det indeholdende vindue i vores visning har ændret synligheden. Dette garanterer ikke, at vinduet, som din visning er i, er synligt for brugeren, da det kan være skjult af et andet vindue.

Synlighed lyttere i aktion

For at se disse to lyttere i aktion, lad os oprette et simpelt projekt. Vi har en Lineær Layout med en TextView og en knap. Vi får knappen til at klikke på handling tilføje vores brugerdefinerede visning til layoutet.

Vores brugerdefinerede opfattelse:

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

Og endelig koden i vores 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); } }); } }

Når vi kører applikationen og trykker på knappen får vi:

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

Du kan få prøveprojektet her.

ViewTreeObserver

Dette er et oprindeligt objekt, der har en bred vifte af lyttere, der får besked om forskellige synlighedsændringer i visningstræet. Nogle fremtrædende at være opmærksom på er:

  • OnGlobalLayoutListener
  • OnWindowAttachListener
  • OnWindowFocusChangeListener

For at vedhæfte en ViewTreeObserver skal du gøre følgende:

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

Linjen linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)sørger for, at lytteren kun ringes en gang. Fjern det, hvis du vil fortsætte med at lytte til ændringer.

Hvis du har kommentarer eller forslag, er du velkommen til at give mig besked.