Wie wird der Fokus aller auswählbaren Elemente in einer Ansicht gelöscht?

8

Mein Problem ist einfach. Gewusst wie: Fokus aller Elemente in einer Ansicht löschen, die den Fokus haben kann ( wie EditText -oder- TextView wessen textIsSelectable="true" und der Text ist ausgewählt in es beim Auftreten des clearFocus-Ereignisses ).

Warum frage ich (falls ich keine generische Antwort oben bekomme):

Ich habe einige Fragmente , auf die über Navigationsansicht zugegriffen wird. Mein Hauptziel besteht darin, den Fokus der Elemente im Fragment in der geöffneten Schublade in der Navigationsansicht zu verlieren. Ich weiß, dass es möglich ist, onDrawerSlide method für den NavigationDrawer zu erhalten und infact in meiner MainActivity eingerichtet zu haben, so dass beim Öffnen der Schublade, wenn mein EditText in einem der Fragmente geöffnet ist, hideSoftKeyboard Code aufgerufen wird, damit er das SoftKeyboard schließt.

Mein Code, um das -Ereignis beim Öffnen von Schublade zu erhalten: (in onCreate () -Methode von MainActivity)

%Vor%

Hier ist mein hideSoftKeyboard () Code generisch und kann SoftKeyboard schließen, egal welches Fragment gerade von der MainActivity selbst sichtbar ist . Ähnliches Ich möchte clearFocus von allen meinen EditTexts und TextView (da die Option Kopieren / Einfügen in der Mitte der Schublade angezeigt wird, wenn sie geöffnet ist).

Ich weiß, dass ich Code für jedes Fragment schreiben kann, indem ich die Funktion "DownloaderSlide" aufruft und den Fokus für jedes Element einzeln lösche, aber ich möchte wissen, ob es für eine generische Lösung möglich ist und wie es gemacht wird.

(Wenn es möglich ist, kann es viele Implikationen davon geben und kann in vielen Fällen helfen)

    
Kaushik NP 26.02.2017, 19:51
quelle

3 Antworten

5

Nun, ich entschied schließlich, dass ich nicht länger auf eine allgemeine Antwort warten konnte, und entschied mich daher, onDrawerSlide für jedes Fragment zu implementieren . Stellt sich heraus, sogar das ist ein bisschen schwierig, da Sie auf Ihre Symbolleiste zugreifen müssen und Ihre Schublade mit der aktuellen Schublade einrichten und ein wenig experimentieren wurde NPE werfen! (Nur mein gewöhnliches Glück)

Also ging es durch die offizielle Android-Entwickler-Seite, um einen Einblick zu bekommen, als mir das aufblitzte. Warum nicht getCurrentFocus verwenden, um meine aktuelle Ansicht zu erhalten, und dann clearFocus() ! Und voilla, es funktioniert. Ich konzentrierte mich so sehr auf die komplexe Situation, dass ich vergaß, die einfachen Teile zu überprüfen.

Hier ist also die Antwort auf meine eigene Frage: (in onCreate for MainActivity)

%Vor%

Danke an @keivan Esbati, dass er auf eine Lücke hingewiesen hat, die ich aufgrund der Verwendung der Dummy-Ansicht nicht bemerkt habe (wird in Layout-XML verwendet, so dass der erste EdiText nicht den Fokus erhält, sobald Layout geladen ist). Wie im Android Developer Forum:

  

clearFocus (): Wenn eine Ansicht den Fokus löscht, versucht das Framework, den Fokus zu geben   zur ersten fokussierbaren Ansicht von oben. Daher, wenn diese Ansicht die ist   Zuerst von oben, das den Fokus nehmen kann, dann alle Rückrufe   Clearing-Fokus wird aufgerufen, nach dem der Rahmen geben wird   Fokus auf diese Ansicht.

Dazu gehört natürlich, eine Dummy-Variable einzurichten, die den Fokus aufruft, sobald das Layout geladen ist (Methode, die ich verwendet habe) oder dies wie von @keivan geteilt.

Hinweis: Ich hatte ein Kopfgeld dafür ausgegeben, da niemand antworten konnte und ich selbst die Antwort bekam, frage mich, was mit der Bounty passieren wird: D

Update: Bounty ist abgelaufen und es ist nichts passiert. Schätze, es macht Sinn, wenn du die Werbetheorie befolgst.

    
Kaushik NP 02.03.2017, 08:36
quelle
3

Um den Fokus von einer Ansicht zu löschen, können Sie getCurrentFocus().clearFocus() aufrufen. Denken Sie jedoch daran, dass Sie den Fokus einfach von der aktuellen Ansicht auf das erste Element in Ihrer Ansicht verschieben, nicht den Fokus vollständig aus den Ansichten entfernen; Wenn das erste Element in Ihrem Layout ein EditText ist, wird es wieder den Fokus erhalten.

Eine Möglichkeit, sicherzustellen, dass Ihre Ansicht nicht erneut fokussiert wird, besteht darin, diese Attribute zu Ihrer Stammansicht in Ihrem XML-Code hinzuzufügen, damit die Root-Ansicht den Fokus erfassen kann:

%Vor%

Wenn Sie also Ihr Root-Element wie unten deklarieren, wird automatisch der Fokus erfasst, bevor es die untergeordneten Ansichten erreicht:

%Vor%     
Keivan Esbati 07.03.2017 12:38
quelle
0

Wenn Sie mehrere Aktivitäten haben und in diesen Aktivitäten nur eine Aktivität haben, haben Sie die Navigationsansicht. In diesem Fall, wenn Sie den Fokus auf navView löschen möchten, verwenden Sie diesen Code,

%Vor%     
Nazmus Saadat 07.08.2017 06:04
quelle