2017-05-25 5 views
2

Ich habe RecyclerView und in einigen Fällen zeige ich eine andere Ansicht darüber - ProgressDialog, AlertDialog oder DialogFragment.Listener, um festzustellen, ob eine Ansicht auf der Vorderseite ist?

Gibt es eine Möglichkeit, mich über Fälle zu informieren, wenn meine RecyclerView vorne ist oder eine andere Ansicht darüber ist?

Ich habe versucht, onFocusChangeListener() zu meinem RecyclerView hinzuzufügen, aber kein Glück.

PS. Definitiv kann ich in meiner RecyclerView eine Methode erstellen isOnFront(boolean onFront) und in allen meinen anderen Ansichten nennen Sie es, aber vielleicht gibt es mehr Eleganz Weg?

+0

Ich habe eine trickreiche Lösung. Wenn Ihre Fälle nur so aussehen wie "ProgressDialog", "AlertDialog" oder "DialogFragment", dann sollten Sie 'onPause()' und 'onResume()' der Aktivität oder des Fragments überschreiben, wo Ihre 'Recyclerview 'ist implementiert. Der Dialog zeigt die Methode onPause() an, und wenn Sie diesen Dialog verlassen, wird 'onResume()' dieser Aktivität aufgerufen. Dadurch können Sie feststellen, ob 'Recyclerview' im Fokus ist oder nicht. – Moinkhan

+0

Nein, das wird nicht funktionieren, da ich Dialog von derselben Aktivität zeige. Da Dialoge außerdem modal sein sollten, füge ich sie über 'FragmentManager.add()' anstelle von 'FragmentManager.replace()' hinzu. Also ruft 'onPause()' überhaupt nicht auf. –

+0

Ok, also für Fragment können Sie auf Backstack Count arbeiten. Sie können herausfinden, ob ein Fragment vorhanden ist oder nicht. – Moinkhan

Antwort

1

ProgressDialog, AlertDialog und DialogFragment würden legen ihre Inhalte auf dem Window, nicht zu/Ihre Aktivität Ansicht Hierarchie des Fragments. Das heißt, sobald einer von ihnen angezeigt wird, wird der Fokus von Window geändert.

 

    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

Danke, werde es versuchen! –

+0

Ja, das macht einen Trick, aber eine kleine Sache - 'addOnWindowFocusChangeListener' benötigt API-Level 18. Irgendeine Idee für frühere APIs? –

+0

Ich nehme an, [getWindow() .getCurrentFocus() '] (https://developer.android.com/reference/android/view/Window.html#getCurrentFocus()) wird den Trick machen. Es gibt 'null' zurück, wenn ** nicht ** eine Ansicht mit einem Fokus existiert. – azizbekian

1

Ich glaube, Sie Ihre Software-Design überdenken sollte: Daher können Sie die Verwendung von ViewTreeObserver#addOnWindowFocusChangeListener() API machen. Wenn Sie einen Dialog auslösen, der über einer anderen Ansicht angezeigt wird, dann sollten Sie wissen, ob sie angezeigt werden oder nicht. Eine andere Frage ist: Warum sollte Ihre RecyclerView etwas über andere Ansichten in Ihrer Anwendung wissen?

Wenn Sie wirklich wissen möchten, ob Ihr Dialog angezeigt wird oder nicht, legen Sie eine boolesche Variable in Ihrem Fragment (oder Ihrer Aktivität) fest, wenn Sie es anzeigen. Oder verwenden Sie das Feld selbst als Indikator (myDialog != null entspricht "myDialog wird angezeigt"). Setzen Sie es auf null, wenn Sie Ihr Dialogfeld schließen. Wenn Sie wirklich andere Fragments oder Views wissen lassen müssen, dass Sie ein Dialogfeld darüber anzeigen, können Sie jede Art von Ereignisbus verwenden, um dieses Ereignis zu übertragen.

Ich empfehle nicht, irgendeine Art von ViewTreeObserver-Listener oder FragmentBackstack Listener zu manipulieren, um dieses Ergebnis zu erhalten.

+0

Auch eine gute Idee, danke. –

Verwandte Themen