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:
- A Nézet már része az elrendezésnek, mivel egy XML fájlban van meghatározva
- 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:
- LÁTHATÓ (0) - A nézet a felhasználó számára látható
- LÁTHATATLAN (4) - A nézet láthatatlan a felhasználó számára, de mégis helyet foglal az elrendezésben
- 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.