侦听器检测视图是否在前面?
Listener to detect whether a view is at the front?
我有 RecyclerView
,在某些情况下,我会在它上面显示另一个视图 - ProgressDialog
、AlertDialog
或 DialogFragment
。
当我的 RecyclerView
在前面或另一个视图现在在它上面时,有什么方法可以通知我吗?
我尝试将 onFocusChangeListener()
添加到我的 RecyclerView
,但没有成功。
PS。当然,我可以在我的 RecyclerView
中创建一些方法 isOnFront(boolean onFront)
并在我所有其他视图中调用它,但也许有一些更优雅的方式?
ProgressDialog
、AlertDialog
和 DialogFragment
会将他们的内容放在 Window
上, 而不是 到您的 activity's/fragment 的视图层次结构。这意味着,一旦显示其中任何一个,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
应该了解您应用程序中的其他视图?
如果您真的想知道是否显示对话框,请在显示对话框时在 Fragment(或 Activity)中设置一个布尔变量。或者使用字段本身作为指标(myDialog != null
等于 "myDialog is shown")。如果您关闭对话框,请将其设置为 null。如果您真的需要让其他 Fragments
或 Views
知道,您可以在他们上面显示一个对话框,您可以使用任何类型的事件总线来广播此事件。
我不建议篡改任何类型的 ViewTreeObserver 侦听器或 FragmentBackstack 侦听器来获得此结果。
我有 RecyclerView
,在某些情况下,我会在它上面显示另一个视图 - ProgressDialog
、AlertDialog
或 DialogFragment
。
当我的 RecyclerView
在前面或另一个视图现在在它上面时,有什么方法可以通知我吗?
我尝试将 onFocusChangeListener()
添加到我的 RecyclerView
,但没有成功。
PS。当然,我可以在我的 RecyclerView
中创建一些方法 isOnFront(boolean onFront)
并在我所有其他视图中调用它,但也许有一些更优雅的方式?
ProgressDialog
、AlertDialog
和 DialogFragment
会将他们的内容放在 Window
上, 而不是 到您的 activity's/fragment 的视图层次结构。这意味着,一旦显示其中任何一个,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
应该了解您应用程序中的其他视图?
如果您真的想知道是否显示对话框,请在显示对话框时在 Fragment(或 Activity)中设置一个布尔变量。或者使用字段本身作为指标(myDialog != null
等于 "myDialog is shown")。如果您关闭对话框,请将其设置为 null。如果您真的需要让其他 Fragments
或 Views
知道,您可以在他们上面显示一个对话框,您可以使用任何类型的事件总线来广播此事件。
我不建议篡改任何类型的 ViewTreeObserver 侦听器或 FragmentBackstack 侦听器来获得此结果。