2017-05-25 77 views
2

我有RecyclerView,在某些情况下,我在其上显示了另一个视图 - ProgressDialog,AlertDialogDialogFragment监听器检测视图是否在前面?

有没有办法通知我有关当我的RecyclerView在前面或另一个视图在上面的情况?

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

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

+0

我有棘手的解决方案,如果你的情况就像显示'ProgressDialog','AlertDialog'或'DialogFragment',那么你应该重写'onPause()'和'onResume()'活动或片段,你的'Recyclerview '被执行。显示对话框将调用onPause()方法,并且关闭该对话框将调用该活动的onResume(),从中您可以知道“RecyclerView”是否处于焦点状态。 – Moinkhan

+0

不,这不起作用,因为我从相同的活动中显示对话框。此外,由于对话框应该是模态的,我通过'FragmentManager.add()'而不是'FragmentManager.replace()'添加它们。所以'onPause()'根本就没有调用。 –

+0

好吧,你可以在后台堆栈上工作。你可以找出片段是否存在。 – Moinkhan

回答

1

ProgressDialogAlertDialogDialogFragment奠定其在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 
      } 
      } 
     }); 
 
+0

谢谢,会试试看! –

+0

是的,这是一个窍门,但是一件小事 - “addOnWindowFocusChangeListener”需要API级别18。对于早期API的任何想法? –

+0

我想['getWindow().getCurrentFocus()'](https://developer.android.com/reference/android/view/Window.html#getCurrentFocus())将做的伎俩。如果存在** not **存在焦点视图,它将返回'null'。 – azizbekian

1

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

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

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

+0

也是一个好主意,谢谢。 –