3

我有RecyclerView,并且在某些情况下,我会在它上面显示另一个视图ProgressDialog-AlertDialogDialogFragment.

当我RecyclerView在前面或另一个视图现在在它上面时,有什么方法可以通知我有关情况吗?

我试图添加onFocusChangeListener()到我的RecyclerView,但没有运气。

PS。当然,我可以在我的RecyclerView创建一些方法isOnFront(boolean onFront)和我所有的其他视图中调用它,但也许有一些更优雅的方法?

4

2 回答 2

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

于 2017-06-04T18:55:24.593 回答
1

我认为你应该重新考虑你的软件设计。如果您触发对话框显示在另一个视图之上,那么您应该知道是否显示。另一个问题是:为什么要RecyclerView了解应用程序中的其他视图?

如果您真的想知道,如果您的对话框是否显示,请在显示时在 Fragment(或 Activity)中设置一个布尔变量。或者使用字段本身作为指示符(myDialog != null等于“显示 myDialog”)。如果您关闭对话框,请将其设置为 null。如果你真的需要让其他FragmentsViews知道,你在他们之上显示一个对话框,你可以使用任何类型的事件总线来广播这个事件。

我不建议篡改任何类型的 ViewTreeObserver 侦听器或 FragmentBackstack 侦听器来获取此结果。

于 2017-06-06T11:41:28.707 回答