2017-05-25 74 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

也是一個好主意,謝謝。 –