Question

I am creating my own IME for device. What I need to add is a TextBox above keyboardView as shown in below image. Although I am able to display it as shown in below image but I am unable to write text into it.

enter image description here

I am extending keyboard view and below is the layout structure

<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);
    }
}

Thanks, Nil

Was it helpful?

Solution

You can capture your softkeyboard events and transmit them to your own widgets by implementing KeyboardView.OnKeyboardActionListener.

In your Inputmethodservice.onKey() Method, you should try to transmit the event to your InputView subviews like this:

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) {}
}

Edit

To answer your comment about the difference between glyph and keycode, here's a code snippet that can help you:

//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 */ }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top