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