Android Actionbar Tabs und Tastatur Fokus

8

Problem

Ich habe eine sehr einfache Aktivität mit zwei Tabs, und ich versuche, Tastatureingabe in einer benutzerdefinierten Ansicht zu behandeln. Das funktioniert super ... bis ich die Tabs vertausche. Sobald ich Tabs vertauscht habe, kann ich die Ereignisse nie mehr erfassen. In einer anderen Anwendung würde das Öffnen eines Dialogs und das Schließen des Dialogs jedoch die Ausführung der Schlüsselereignisse ermöglichen. Ohne das habe ich keine Möglichkeit gefunden, meine Schlüsselereignisse wieder zu bekommen.

Was ist das Problem hier? Ich kann keine Möglichkeit finden, wichtige Ereignisse zu bekommen, sobald ich die Tabs vertauscht habe, und bin gespannt, was sie isst. Dieses Beispiel ist ziemlich kurz und auf den Punkt.

Code

main.xml

%Vor%

meine_fragment.xml

%Vor%

TastaturTestAktivität.java

%Vor%     
nacitar sevaht 10.11.2011, 23:12
quelle

1 Antwort

10

Ich habe mein eigenes Problem gelöst, also dachte ich, ich würde die Lösung teilen. Wenn es ein Wortwahlproblem gibt, korrigiere mich bitte in einem Kommentar; Ich versuche, so genau wie möglich zu sein, aber ich bin nicht nur ein Android-Experte. Diese Antwort sollte auch als hervorragendes Beispiel dafür dienen, wie man mit dem Austauschen von ActionBar-Tabs umgehen kann. Ob das Design des Lösungscodes gefällt oder nicht, sollte nützlich sein.

Der folgende Link hat mir geholfen, mein Problem herauszufinden: Ссылка

Lösung

Es stellt sich heraus, dass es zwei wichtige Probleme gibt. Erstens, wenn eine Ansicht sowohl android: fokussierbar und android: focusableInTouchMode ist, dann könnte man auf einem Wabentablett erwarten, dass das Tippen darauf und Ähnliches es fokussieren würde. Dies ist jedoch nicht unbedingt richtig. Wenn diese Ansicht mit auch zusammenfällt, dann wird durch Andocken die Ansicht fokussiert. Wenn es nicht anklickbar ist, wird es nicht durch Berührung fokussiert.

Darüber hinaus gibt es beim Austauschen eines Fragments ein Problem, das dem beim ersten Instanziieren der Ansicht für eine Aktivität sehr ähnlich ist. Bestimmte Änderungen müssen erst vorgenommen werden, nachdem die View-Hierarchie vollständig vorbereitet wurde.

Wenn Sie "requestFocus ()" in einer Ansicht innerhalb eines Fragments aufrufen, bevor die Ansichtshierarchie vollständig vorbereitet ist, wird die Ansicht in der Tat denken, dass sie fokussiert ist. Wenn die Soft-Tastatur jedoch aktiv ist, werden keine Ereignisse an diese Ansicht gesendet. Schlimmer noch, wenn diese Ansicht anklickbar ist, wird das Problem mit dem Tastaturfokus nicht behoben, wenn Sie an dieser Stelle darauf tippen, da die Ansicht denkt, dass sie tatsächlich fokussiert ist und nichts zu tun hat. Wenn Sie eine andere Ansicht fokussieren und dann auf diese zurück tippen möchten, ist sie sowohl anklickbar als auch fokussierbar und fokussiert und leitet auch Tastatureingaben an diese Ansicht weiter.

Wenn Sie diese Informationen angeben, besteht der richtige Ansatz zum Festlegen des Fokus beim Wechseln zu einer Registerkarte darin, nach dem Einlagern ein Runnable in die View-Hierarchie für das Fragment zu posten und erst dann requestFocus () aufzurufen. Das Aufrufen von requestFocus () nachdem die Ansichtshierarchie vollständig vorbereitet ist, wird sowohl die Ansicht als auch die direkte Tastatureingabe darauf fokussieren, wie wir es wollen. Es wird nicht in diesen merkwürdigen fokussierten Zustand gelangen, in dem die Ansicht fokussiert ist, aber die Tastatureingabe ist irgendwie nicht darauf gerichtet, wie es passieren wird, wenn requestFocus () aufgerufen wird, bevor die Ansichtshierarchie vollständig vorbereitet ist.

Außerdem ist es wichtig, dass das Tag "requestFocus" innerhalb des XML-Layouts eines Fragments die Funktion requestFocus () zu früh aufruft. Es gibt keinen Grund, dieses Tag jemals im Layout eines Fragments zu verwenden. Außerhalb eines Fragments, vielleicht ... aber nicht innerhalb.

Im Code habe ich einen EditText am oberen Rand des Fragments hinzugefügt, nur um das Verhalten der Fokusänderung zu testen. Wenn Sie auf die benutzerdefinierte Ansicht tippen, wird auch die Soft-Tastatur umgeschaltet. Wenn Sie Registerkarten austauschen, sollte der Fokus standardmäßig auch auf der benutzerdefinierten Ansicht liegen. Ich habe versucht, den Code effektiv zu kommentieren.

Code

TastaturTestAktivität.java

%Vor%

main.xml

%Vor%

meine_fragment.xml

%Vor%     
nacitar sevaht 11.11.2011, 21:11
quelle

Tags und Links