Tastatursensoren unter Android
In dem folgenden Programm wird ein Textfeld der Klasse »android.widget.TextView« angelegt.
Das Objekt »this« wird dann als Ereignisempfänger für jenes Textfeld festgelegt, wodurch die Methode »onKey« bei einer Tasteingabe in jenem Textfelde aufgerufen wird. Diese Methode gibt dann aus, ob eine Taste gedrückt oder losgelassen wurde und um welche Taste es sich handelt.
Das Verbrauchen einer Eingabe
Die beiden Ereignismethoden »onLongClick« und »onKey« geben einen Wahrheitswert zurück, der besagt, ob das Ereignis von diesen Methoden „verbraucht“ wurde. Falls dies zutrifft, so bedeutet es, daß das Betriebssystem dieses Ereignis ignorieren soll. Im Fall von »onKey« soll die Zurücktaste „◅“ nicht als verbraucht gelten, weil sie ihre normale Funktion beibehalten soll.
Der Berührungsmodus
Die Betätigung einer Taste legt selber keine Position oder Region auf dem Bildschirm fest. Daher wird diese Position oder Region separat als sogenannter „Fokus“ festgelegt. Der Fokus ist von klassischen Benutzeroberfläche, die mit Tastatur und Maus arbeiten bekannt. Beispielsweise legt er fest, wo ein über die Tastatur eingegebenes Zeichen erscheint oder auf welche Stelle sich ein Antippen einer Maustaste bezieht.
Bei der Berührung des Bildschirmes wird hingegen immer eine Positon festgelegt. Daher ist bei einer Berührungseingabe kein separater Fokus notwendig.
Durch eine Berührungseingabe schaltet ein Android-Gerät in den Berührungsmodus, in dem es keinen Fokus gibt. Umgekehrt wird der Berührungsmodus verlassen, wenn Eingaben über andere Eingabegeräte erfolgen.
Damit ein Textfeld auch im Berührungsmodus den Fokus erhalten kann, muß es mit dem Aufruf »setFocusableInTouchMode( true )« modifiziert werden.
Die Bildschirmtastatur
Die Bildschirmtastatur wird auch als „weiche Eingabemethode“ (“soft input method ”) bezeichnet.
Durch »toggleSoftInput« wird die Bildschirmtastatur angezeigt.
Durch »SHOW_FORCED« wird erklärt, daß der Bediener die Bildschirmtastatur erzwungen hat (etwa durch langes Drücken) und sie deswegen erst wieder verschwinden soll, wenn dies ausdrücklich verlangt wird.
MainActivity.java
package com.example;
public class MainActivity extends android.app.Activity
implements android.view.View.OnKeyListener
{
final java.lang.StringBuilder builder = new java.lang.StringBuilder();
android.widget.TextView text;@java.lang.Override public void onCreate( final android.os.Bundle bundle )
{ super.onCreate( bundle );
final android.view.inputmethod.InputMethodManager manager
=( android.view.inputmethod.InputMethodManager )
getSystemService( android.content.Context.INPUT_METHOD_SERVICE );
this.text = new android.widget.TextView( this );
this.text.setOnKeyListener( this );
this.text.setFocusableInTouchMode( true );
setContentView( text );
this.text.setOnLongClickListener
( new android.view.View.OnLongClickListener()
{ @java.lang.Override public boolean onLongClick( final android.view.View view )
{ MainActivity.this.text.requestFocus();
manager.toggleSoftInput( android.view.inputmethod.InputMethodManager.SHOW_FORCED, 0 );
final boolean theLongClickHasBeenConsumed = true; return theLongClickHasBeenConsumed; }}); }
@java.lang.Override public boolean onKey
( final android.view.View view, final int key, final android.view.KeyEvent event )
{ this.builder.setLength( 0 );
switch( event.getAction() )
{ case android.view.KeyEvent.ACTION_DOWN: builder.append( "DOWN " ); break;
case android.view.KeyEvent.ACTION_UP: builder.append( "UP " ); break; }
this.builder.append( event.getKeyCode() );
builder.append( " " );
builder.appendCodePoint( event.getUnicodeChar() );
{ final java.lang.String s = builder.toString();
android.util.Log.d( "touch log", s );
text.setText( s ); }
final boolean onKeyHasConsumedThisKey = android.view.KeyEvent.KEYCODE_BACK != event.getKeyCode();
return onKeyHasConsumedThisKey; }}
Notiz *
adb shellinput keyevent <key code number or name>