Ключевая проблема с клавиатурой Android - PullRequest
6 голосов
/ 20 марта 2012

В настоящее время я работаю над созданием специального приложения для клавиатуры, которое будет оптимизировано для устройства, использующего DPad в качестве основного устройства ввода.

Моя проблема в том, что когда курсор находится в поле EditText и вы нажимаете (например, KEYCODE_DPAD_DOWN), вид клавиатуры не получает фокус и KeyEvents. Либо ничего не происходит, либо элемент ниже рассматриваемого EditText получает фокус.

Ниже приведен соответствующий код.

Любая помощь будет высоко ценится. Я попытался разобрать пример SoftKeyboard так же как KeyboardView.java для подсказок без успеха.

Спасибо, Bryan

MyKeyboard.java

public class MyKeyboard extends InputMethodService {

    private static final String TAG = "MyKeyboard";
    private MyKeyboardView mInputView = null;

    @Override public void onCreate() {
        super.onCreate();
    }

    @Override public View onCreateInputView() {
        mInputView = (MyKeyboardView) getLayoutInflater().inflate(R.layout.input, null);

        // attempts to make this focusable
        mInputView.setClickable(true);
        mInputView.setFocusableInTouchMode(true);
        mInputView.setFocusable(true);
        mInputView.setEnabled(true);

        return mInputView;
    }

    @Override public View onCreateCandidatesView() {
        super.onCreateCandidatesView();
        return null;
    }

    @Override public void onStartInputView(EditorInfo info, boolean restarting) {
        super.onStartCandidatesView(info, restarting);
    }

    @Override public void onFinishInput() {
        super.onFinishInput();
    }

    @Override public void onDestroy() {
        super.onDestroy();
    }
}

MyKeyboardView.java

public class MyKeyboardView extends TableLayout implements View.OnClickListener, View.OnFocusChangeListener {

    private static final String TAG = "MyKeyboardView";
    private ArrayList<Character> charList = new ArrayList<Character>();

    public MyKeyboardView(Context context) {
        super(context);

        populateKeyboard();
        this.setOnFocusChangeListener(this);
        this.setOnClickListener(this);
    }

    public MyKeyboardView(Context context, AttributeSet attrs) {
        super(context, attrs);

        populateKeyboard();
        this.setOnFocusChangeListener(this);
        this.setOnClickListener(this);
    }

    @Override
    public void onClick(View arg0) {
        Log.d(TAG, "onClick");
    }

    private void populateKeyboard() {
        charList.add(new Character(','));
        charList.add(new Character('.'));
        charList.add(new Character('?'));
        charList.add(new Character('<'));
        charList.add(new Character('>'));
        charList.add(new Character((char) 0x2798)); // arrow
        charList.add(new Character((char) 0x2798)); // arrow
        charList.add(new Character((char) 0x2798)); // arrow
        charList.add(new Character((char) 0x005F)); // underscore
        for(char c = '@'; c < 'Z'; c++) {
            charList.add(new Character(c));
            Log.d(TAG, "char: " + c);
        }


        TableRow tr = null;
        for(int i=0; i<charList.size(); i++) {
            if(i % 7 == 0) {
                if(tr != null)
                    this.addView(tr);
                tr = new TableRow(this.getContext());
                tr.setGravity(Gravity.CENTER_HORIZONTAL);
            }
            TextView tv = new TextView(this.getContext());
            tv.setPadding(21, 2, 21, 2);
            tv.setText(charList.get(i).toString());
            tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 22);
            tv.setTextColor(Color.WHITE);
            tv.setGravity(Gravity.CENTER);
            tv.setFocusable(true);
            tv.setEnabled(true);

            tr.addView(tv);
        }
        if(tr.getChildCount() > 0)
            this.addView(tr);
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        Log.d(TAG, "mInputView onFocusChange " + (hasFocus ? "true" : "false"));
    }
}

Input.xml

<?xml version="1.0" encoding="utf-8"?>
<com.weirdtuesday.mykeyboard.MyKeyboardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/input"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:background="#FF000000"
    android:focusable="true" />

1 Ответ

2 голосов
/ 09 апреля 2012

Ключевые события должны обрабатываться вручную в методе onKey. Чтобы переместить курсор, я использую это:

if (primaryCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
        int position = connection.getTextBeforeCursor(Integer.MAX_VALUE, 0)
                .length();
        final CharSequence selected = connection.getSelectedText(0);
        if (selected != null)
            connection.commitText(
                    mComposing.substring(0,
                            mComposing.length() - selected.length()), 1);
        else
            connection.commitText(mComposing, 1);
        connection.setSelection(position + 1, position + 1);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...