UI Android este construit din Views și, într-o aplicație obișnuită, există de obicei mai multe dintre ele. Pentru a afla la ce vizualizare se uită în prezent utilizatorul, trebuie să instalați Ascultători de vizibilitate.

Citiți mai jos pentru a afla despre diferitele opțiuni pe care le aveți pentru a identifica starea de vizibilitate a unei Vizualizări.

Cum să devii vizibil

Pentru ca ascultătorii noștri să funcționeze, trebuie mai întâi să ne asigurăm că vizualizarea noastră se găsește în ierarhia aspectului. Există două moduri în care se întâmplă acest lucru:

  1. Vizualizarea dvs. face deja parte din aspectul dvs., deoarece este definit într-un fișier XML
  2. Ați creat o vizualizare dinamic și trebuie să o adăugați folosind metoda addView
public void addView (View child, ViewGroup.LayoutParams params)
copil este vizualizarea pe care doriți să o adăugați și LayoutParams sunt parametrii de aspect (lățimea și înălțimea IE)

Starea vizibilității unei vizualizări este de tip întreg și poate avea una dintre cele trei opțiuni:

  1. VIZIBIL (0) – Vizualizarea este vizibilă pentru utilizator
  2. INVIZIBIL (4) – Vizualizarea este invizibilă pentru utilizator, dar ocupă totuși spațiu în aspect
  3. GONE (8) – Vizualizarea este invizibilă și nu ocupă spațiu în aspect

Odată ajunși în ierarhia de aspect, există câteva opțiuni native pentru a ne ajuta să știm când s-a schimbat vizibilitatea vizualizării noastre.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

Această metodă este declanșată atunci când vizibilitatea vederii sau a unui strămoș al vederii s-a schimbat. Starea vizibilității se găsește în parametrul de vizibilitate.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

Această metodă este declanșată atunci când fereastra care conține vizualizarea noastră și-a schimbat vizibilitatea. Acest lucru nu garantează că fereastra în care se află vizualizarea dvs. este vizibilă pentru utilizator, deoarece poate fi ascunsă de o altă fereastră.

Ascultători de vizibilitate în acțiune

Pentru a vedea acești doi ascultători în acțiune, permiteți-ne să creăm un proiect simplu. Vom avea un LinearLayout cu un TextView și un buton. Vom face ca acțiunea butonului de clic să adauge vizualizarea noastră personalizată la aspect.

Cum si de ce sa utilizati Ascultatori de vizibilitate Android

Vizualizarea noastră personalizată:

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, în sfârșit, codul din 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);
            }
        });
    }
}
Atașăm un buton de ascultare OnClick

Când rulăm aplicația și apăsăm butonul, obținem:

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

Puteți obține exemplul de proiect Aici.

ViewTreeObserver

Acesta este un obiect nativ care are o gamă largă de ascultători care sunt anunțați de diferite modificări de vizibilitate în arborele de vizualizare. Unele dintre cele mai importante care trebuie luate în considerare sunt:

Pentru a atașa un ViewTreeObserver, trebuie să faceți următoarele:

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
    } 
});
removeOnGlobalLayoutListener necesită API> 15

Linia linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this) se asigură că ascultătorul va fi sunat o singură dată. Dacă doriți să ascultați în continuare modificările, eliminați-le.

Dacă aveți comentarii sau sugestii, nu ezitați să mă anunțați.