4 Stimmen

EditText auf InputKeyboard starten IME in Android erstellen

Ich erstelle meine eigene IME für das Gerät. Was ich brauche, um hinzuzufügen ist eine TextBox über keyboardView wie im folgenden Bild gezeigt. Obwohl ich in der Lage bin, es anzuzeigen, wie im Bild unten gezeigt, aber ich bin nicht in der Lage, Text in sie zu schreiben.

enter image description here

Ich erweitere die Tastaturansicht, und unten ist die Layout-Struktur

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/wrapper"
    android:layout_height="wrap_content" android:orientation="vertical" 
    android:layout_width="fill_parent" android:background="@color/background" > 

   <TextView android:textAppearance="?android:attr/textAppearanceMedium" android:layout_height="wrap_content" android:id="@+id/txtTest" android:layout_width="fill_parent" android:text="Test" ></TextView>
       <EditText android:inputType="text" android:id="@+id/edtTest" android:layout_height="wrap_content" android:layout_width="fill_parent"></EditText>

<com.keyboard.CustomKeyboardView
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/keyboard"
            android:layout_alignParentBottom="true"
            android:layout_width="fill_parent" android:layout_height="wrap_content"
            android:keyTextSize="15sp"
       />
  </LinearLayout>

public class CustomKeyboardView extends KeyboardView {

static final int KEYCODE_OPTIONS = -100;

private TextView mResultText;
public CustomKeyboardView (Context context, AttributeSet attrs) {
    super(context, attrs);
    }

public CustomKeyboardView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected boolean onLongPress(Key key) {
    if (key.codes[0] == Keyboard.KEYCODE_CANCEL) {
        getOnKeyboardActionListener().onKey(KEYCODE_OPTIONS, null);
        return true;
    } else {
        return super.onLongPress(key);
    }
}

Danke, Nil

2voto

Laurent' Punkte 2591

Sie können Ihre Softkeyboard-Ereignisse erfassen und sie an Ihre eigenen Widgets übertragen, indem Sie KeyboardView.OnKeyboardActionListener .

In Ihrem Inputmethodservice.onKey() Methode, sollten Sie versuchen, das Ereignis an Ihre InputView-Unteransichten wie folgt zu übertragen:

public class mySoftKeyboard 
    extends InputMethodService 
    implements KeyboardView.OnKeyboardActionListener {

// Implementation of KeyboardViewListener inside your InputMethodService
public void onKey(int primaryCode, int[] keyCodes) {
        //assuming your inputview is in private variable mInputView 
        //and contains public members txtTst and edtTst views 
        //(arrange for this in your InputView.onCreate)
        //Here, we just transmit the onKey code to View.onKeyDown/Up and let views draw themselves
        sendKey( mInputView.txtTst , primaryCode ); // send this to your TextView
        sendKey( mInputView.edtTst , primaryCode ); // also send to your EditText
    }

/**
 * Helper to send a character to the editor as raw key events.
 */
private void sendKey(View v, int keyCode) {
          v.onKeyDown(keyCode,new KeyEvent(KeyEvent.ACTION_DOWN, keyCode));
          v.onKeyUp  (keyCode,new KeyEvent(KeyEvent.ACTION_UP, keyCode));
}
    //other interface function, no need to implement
public void onText(CharSequence text){}
public void swipeRight() {}
public void swipeLeft() {}
public void swipeDown() {}
public void swipeUp() {}
public void onPress(int primaryCode) {}
public void onRelease(int primaryCode) {}
}

bearbeiten

Um Ihre Frage nach dem Unterschied zwischen Glyphe und Keycode zu beantworten, finden Sie hier ein Codeschnipsel, das Ihnen helfen kann:

//This snippet tries to translate the glyph 'primaryCode' into key events

//retrieve the keycharacter map from a keyEvent (build yourself a default event if needed)
KeyCharacterMap myMap=KeyCharacterMap.load(event.getDeviceId()); 

//event list to reproduce glyph
KeyEvent evs[]=null;

//put the primariCode into an array
char chars[]=new char[1];
chars[0]=primaryCode;

// retrieve the key events that could have produced this glyph
evs=myMap.getEvents(chars);

if (evs != null){
    // we can reproduce this glyph with this key event array
    for (int i=0; i< evs.length;i++) mySendKeyMethodHelper(evs[i]);
}
else { /* could not find a way to reproduce this glyph */ }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X