Як і чому використовувати прослуховувачі видимості Android

Інтерфейс користувача Android створений на основі Views, і в звичайному додатку їх зазвичай декілька. Щоб дізнатись, яке представлення даних переглядає користувач, потрібно встановити слухачі видимості .

Прочитайте нижче, щоб дізнатись про різні варіанти, якими ви маєте визначити стан видимості представлення.

Як стати видимим

Для того, щоб наші слухачі працювали, ми повинні спочатку переконатися, що наш Погляд знаходиться в ієрархії макета. Існує два шляхи:

  1. Ваш подання вже є частиною вашого макета, як це визначено у файлі XML
  2. Ви створили подання динамічно, і вам потрібно додати його за допомогою методу addView
public void addView (View child, ViewGroup.LayoutParams params)

Статус видимості подання має тип Integer і може мати один із трьох варіантів:

  1. ВИДИМИЙ (0) - Користувач може бачити вигляд
  2. НЕВИДИМИЙ (4) - Вигляд невидимий для користувача, але все одно займає місце в макеті
  3. ВИЙШО (8) - Вигляд невидимий, і він не займає місця в макеті

Опинившись у нашій ієрархії макета, є кілька власних варіантів, які допоможуть нам знати, коли видимість нашого перегляду змінилася.

onVisibilityChanged

protected void onVisibilityChanged (View changedView, int visibility)

Цей метод спрацьовує, коли видимість виду або предка виду змінилася. Стан видимості знаходиться всередині параметра видимості.

onWindowVisibilityChanged

protected void onWindowVisibilityChanged (int visibility)

Цей метод спрацьовує, коли вікно, що містить вікно нашого подання, змінило свою видимість. Це не гарантує того, що вікно, у якому знаходиться ваш вигляд, є видимим для користувача, оскільки воно може бути затемнене іншим вікном.

Слухачі видимості в дії

Щоб побачити цих двох слухачів у дії, давайте створимо простий проект. У нас буде LinearLayout із TextView та кнопкою. Ми зробимо так, щоб кнопка при натисканні додавала до макета наш власний вигляд.

Наш власний погляд:

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

І нарешті, код у нашій 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); } }); } }

Коли ми запускаємо додаток і натискаємо кнопку, ми отримуємо:

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

Ви можете отримати зразок проекту тут.

ViewTreeObserver

Це власний об’єкт, який має широкий спектр слухачів, які отримують повідомлення про різні зміни видимості дерева перегляду. Деякі відомі з них, на які слід звернути увагу:

  • OnGlobalLayoutListener
  • OnWindowAttachListener
  • OnWindowFocusChangeListener

Щоб приєднати ViewTreeObserver, потрібно виконати наступне:

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

Лінія linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this)гарантує, що слухачеві буде викликано лише один раз. Якщо ви хочете продовжувати слухати зміни, видаліть їх.

Якщо у вас є якісь зауваження чи пропозиції, не соромтеся повідомляти мене.