25.02.2014 Aufrufe

Android User Navigation (Vorschau)

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Devcorner<br />

Dasher, Teil II<br />

Wichtige Attribute<br />

Zusätzlich zum extra Editierfeld wird automatisch<br />

rechts daneben ein Aktion-Knopf angezeigt.<br />

Dieser wird mit dem<br />

android:imeOptions-Attribut des darunterliegenden<br />

Texteditors definiert, und ermöglicht<br />

dem Benutzer einen schnellen Zugang zu<br />

den gebräuchlichen Funktionen wie zum<br />

Beispiel Go, Search, Send, Next und Done,<br />

ohne in die ursprüngliche Applikation zurückkehren<br />

zu müssen. Ein zweites wichtiges<br />

Attribut des Texteditors,<br />

android:inputType, informiert die Inputmethode,<br />

welche Art von Text zu erwarten ist.<br />

Die Input-Methode erhält beim Starten jeder<br />

neuen Texteingabe diese Informationen in<br />

Form eines EditorInfo-Objektes. Je nach<br />

Textart könnte somit eine spezielle Textvorhersage-Datenbank<br />

angewendet werden.<br />

Daher ist es ratsam, diese Attribute im Hinblick<br />

auf verschiedene mögliche Texteingabe-<br />

Methoden genau zu definieren.<br />

Abb. 4: Dasher Input-Feld auf einem <strong>Android</strong>-Bildschirm in horizontaler Lage. Grau markiert<br />

sind Leerzeichen. Der Button ^ stellt von Klein- auf Großbuchstaben um.<br />

Die Eingabemethode<br />

Damit Dasher jeder Text-Änderung angepasst<br />

werden kann, muss die Eingabemethode sowohl<br />

den aktuellen Text als auch die Cursor-<br />

Position im Editor-Feld der Applikation ermitteln<br />

können. Das InputConnection-Interface<br />

des InputMethodService dient als Kommunikationskanal<br />

zwischen dem Texteditor<br />

und der Eingabemethode. Da eine Applikation<br />

mehrere Texteditorfelder enthalten kann,<br />

muss der aktuelle Kanal mithilfe von getCurrentInputConnection()<br />

immer neu bestimmt<br />

werden. Listing 1 zeigt als Beispiel, wie der<br />

Dasher-Service die aktuelle Cursor-Position<br />

innerhalb des Editor-Textes eruiert.<br />

Wie bereits betont, stellt das extra Editierfeld,<br />

das im Fullscreeen-Modus erscheint,<br />

eine Art Kopie des darunterliegenden aktiven<br />

Textfeldes dar. Die beiden kommunizieren<br />

aber miteinander: Wird dem Applikationstextfeld<br />

neuer Text via InputConnection geschickt,<br />

so wird dieser im extra Editierfeld<br />

sofort aufgefrischt. Des Weiteren wird das<br />

Erstere benachrichtigt, sobald der Text im<br />

extra Editierfeld angeklickt oder über die<br />

Standard-Funktionen cut oder paste geändert<br />

wurde. Damit neue Symbole nicht nur<br />

am Ende, sondern auch innerhalb des aktuellen<br />

Textes eingefügt werden können, hält das<br />

System standardmässig jede Änderung der<br />

Cursorposition fest. Der neue Text wird dann<br />

mithilfe von setComposingText(,1)<br />

an der entsprechenden Stelle angefügt (Listing<br />

2).<br />

Die angefügten Zeichen müssen aber wieder<br />

gelöscht werden können; entweder sobald<br />

man im Dasher eine neue Richtung einschlägt<br />

und das Wahrscheinlichkeits-Quadrat<br />

des bereits gesetzten Symbols das zentrale<br />

Kreuz wieder verlässt, oder aber wenn man<br />

mit Dasher rückwärts navigiert. Um das zuletzt<br />

gesetzte Zeichen aus dem Textfeld zu<br />

löschen, werden die folgenden zwei rohen<br />

Tastenereignisse (raw key events) via Input-<br />

Connection an die Applikation geschickt (Listing<br />

3).<br />

Alle Ereignisse, die durch eine Selektionsänderung<br />

im extra Editierfeld verursacht<br />

werden, müssen über die Methode onUpdate-<br />

Selection(...) abgefangen werden. Hier<br />

muss die Methode der super-Klasse aufgerufen<br />

werden, damit das Default-Verhalten bei<br />

solchen Ereignissen gewährleistet ist. Dasher<br />

wird entsprechend der Änderung der Cursorposition<br />

aufgefrischt: Das Quadrat des letzten<br />

Buchstabens vor dem Cursor wird in der<br />

Mitte des Bildschirms platziert, als ob es gerade<br />

das Zentralkreuz passiert hätte. Wichtig<br />

ist auch der Aufruf von finishComposing-<br />

Text(), damit die neue Position des Cursors<br />

Listing 2: Neuen Text einfügen<br />

public void pushSymbol(Symbol symbol, boolean alt) {<br />

mComposing.append((alt symbol.getVariant() : symbol.getLabel()));<br />

...<br />

InputConnection icx = getCurrentInputConnection();<br />

if (icx != null)<br />

icx.setComposingText(mComposing, 1);<br />

}<br />

Listing 3: Text löschen<br />

icx.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));<br />

icx.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));<br />

<strong>Android</strong>-user.de März 2012 111

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!