Hogyan és miért kell használni az Android Visibility Listeners alkalmazást

Az Android felhasználói felület a Views-ból épül fel, és egy szokásos alkalmazásban általában több van belőlük. Ahhoz, hogy megtudja, melyik View-t nézi a felhasználó jelenleg, telepítenie kell a Visibility Listeners alkalmazást .

Az alábbiakban olvashat, hogy megismerje a nézet láthatósági állapotának azonosításához szükséges különböző lehetőségeket.

Hogyan válhat láthatóvá

A hallgatók működése érdekében először meg kell győződnünk arról, hogy a Nézetünk megtalálható-e az elrendezési hierarchiában. Kétféle módon történik ez:

  1. A Nézet már része az elrendezésnek, mivel egy XML fájlban van meghatározva
  2. Dinamikusan létrehozott egy nézetet, amelyet hozzá kell adnia az addView módszerrel
public void addView (View child, ViewGroup.LayoutParams params)

A nézet láthatósági állapota egész szám, és három lehetőség közül választhat:

  1. LÁTHATÓ (0) - A nézet a felhasználó számára látható
  2. LÁTHATATLAN (4) - A nézet láthatatlan a felhasználó számára, de mégis helyet foglal az elrendezésben
  3. GONE (8) - A nézet láthatatlan, és nem foglal helyet az elrendezésben

Miután eljutottunk az elrendezési hierarchiánkba, van néhány natív lehetőség, amelyek segítségével megtudhatjuk, mikor változott a Nézetünk láthatósága.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

Ezt a módszert akkor indítják el, amikor a nézet vagy a nézet elődjének láthatósága megváltozott. A láthatóság állapota a láthatósági paraméter belsejében található.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

Ez a módszer akkor indul el, amikor a Nézetünket tartalmazó ablak megváltoztatta láthatóságát. Ez nem garantálja, hogy a Nézet ablak látható a felhasználó számára, mivel egy másik ablak elhomályosíthatja.

Láthatósági hallgatók működés közben

Ha látni akarjuk ezt a két hallgatót, hozzunk létre egy egyszerű projektet. LinearLayout lesz egy TextView-val és egy gombbal. A gombra kattintás gombra kattintva hozzáadjuk az egyéni nézetünket az elrendezéshez.

Egyéni nézetünk:

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

Végül pedig a MainActivity kódja:

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

Amikor futtatjuk az alkalmazást, és megnyomjuk a kapott gombot:

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

A mintaprojektet itt szerezheti be.

ViewTreeObserver

Ez egy natív objektum, amely széles hallgatók körével rendelkezik, és értesítést kapnak a nézetfa különböző láthatósági változásairól. Néhány kiemelkedő figyelemre méltó:

  • OnGlobalLayoutListener
  • OnWindowAttachListener
  • OnWindowFocusChangeListener

A ViewTreeObserver csatolásához a következőket kell tennie:

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

A vonal linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)gondoskodik arról, hogy a hallgatót csak egyszer hívják meg. Ha továbbra is figyelni akarja a változásokat, távolítsa el azokat.

Ha bármilyen észrevétele vagy javaslata van, nyugodtan ossza meg velem.