Слушатель, чтобы определить, находится ли вид спереди?
Я имею RecyclerView
и, в некоторых случаях, я показываю другой вид поверх этого - ProgressDialog
, AlertDialog
или же DialogFragment
,
Есть ли способ сообщить мне о случаях, когда мой RecyclerView
находится спереди или другой вид над ним сейчас?
Я пытался добавить onFocusChangeListener()
к моему RecyclerView
, но не повезло.
PS. Определенно, я могу в моем RecyclerView
создать какой-то метод isOnFront(boolean onFront)
и во всех других моих взглядах это называют, но, может быть, есть более элегантный способ?
2 ответа
ProgressDialog
, AlertDialog
а также DialogFragment
положил бы их содержание на Window
, а не к иерархии представления вашей деятельности / фрагмента. Это означает, что, как только один из них будет показан, фокус Window
изменено Следовательно, вы можете использовать ViewTreeObserver#addOnWindowFocusChangeListener()
API:
contentView.getViewTreeObserver().addOnWindowFocusChangeListener(
new ViewTreeObserver.OnWindowFocusChangeListener() {
@Override public void onWindowFocusChanged(boolean hasFocus) {
// Remove observer when no longer needed
// contentView.getViewTreeObserver().removeOnWindowFocusChangeListener(this);
if (hasFocus) {
// Your view hierarchy is in the front
} else {
// There is some other view on top of your view hierarchy,
// which resulted in losing the focus of window
}
}
});
Я думаю, что вы должны переосмыслить свой дизайн программного обеспечения. Если ВЫ запускаете диалоги, которые будут отображаться поверх других представлений, тогда вы ДОЛЖНЫ знать, показываются они или нет. Другой вопрос: почему ваш RecyclerView
знаете что-то о других видах в вашем приложении?
Если вы действительно хотите знать, отображается ли ваш диалог или нет, установите булеву переменную в вашем фрагменте (или активности), когда вы его показываете. Или используйте само поле в качестве индикатора (myDialog != null
равно "myDialog показано"). Установите значение NULL, если вы закрыли свой диалог. Если вам действительно нужно позволить другим Fragments
или же Views
знать, что вы показываете диалоговое окно поверх них, вы можете использовать любой вид шины событий для трансляции этого события.
Я не рекомендую вмешиваться в какие-либо прослушиватели ViewTreeObserver или FragmentBackstack для получения этого результата.