Пользовательское входное соединение Android не улавливает ключевые события с программной клавиатуры IMEJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Пользовательское входное соединение Android не улавливает ключевые события с программной клавиатуры IME

Сообщение Anonymous »

Я реализую свои собственные виджеты редактирования текста в Android, и теперь хочу реализовать автозамену проверки орфографии. Мне удалось выяснить, что мне необходимо расширить BaseInputConnection, и теперь я могу получать предложения от IME с программной клавиатуры.
Однако мое представление больше не может перехватывать события нажатия клавиш из представления. OnKeyListener включается с помощью setOnKeyListener(). Затем я попробовал использовать метод sendKeyEvent() в BaseInputConnection, но это также не дает мне промежуточных символов.
Я пытаюсь получить промежуточный текст (обычно то, что показано подчеркиванием) перед вызовом commitText() в BaseInputConnection. Я думаю, что лучший способ — просто перехватить sendKeyEvent(), но он не вызывается.
Он вызывается для кнопок, которые не обрабатываются предложениями автозамены, такими как нажатие кнопки питания, но не на реальной клавиатуре.
Вот мой код:

Код: Выделить всё

package com.example.simple;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.SurfaceView;
import android.view.MotionEvent;
import android.view.KeyEvent;
import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputContentInfo;
import android.view.inputmethod.CompletionInfo;
import android.view.inputmethod.BaseInputConnection;
import android.content.Context;
import android.view.Window;
import android.text.InputType;
import android.text.Editable;

class CustomInputConnection extends BaseInputConnection {

public CustomInputConnection(View view, boolean fullEditor) {
super(view, fullEditor);
}

@Override
public boolean sendKeyEvent(KeyEvent event) {
Log.i("darkfi", "got key event");
if (event.getAction() == KeyEvent.ACTION_DOWN) {
char keyChar = (char)event.getUnicodeChar();
Log.i("darkfi", "key event: " + keyChar);
}
return super.sendKeyEvent(event);
}

@Override
public boolean commitText(CharSequence text, int newCursorPosition) {
Log.i("darkfi", String.format("commitText(%s, %d)", text.toString(), newCursorPosition));
return true;
}

@Override
public boolean setSelection(int start, int end) {
Log.i("darkfi", "setSelection");
return true;
}
}

class CustomView
extends
View
implements
View.OnTouchListener {

private InputMethodManager imm;

public CustomView(Context context, InputMethodManager imm){
super(context);

this.imm = imm;

setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
setOnTouchListener(this);
}

@Override
public boolean onTouch(View v, MotionEvent event) {
Log.d("darkfi", "onTouch() v1");
imm.showSoftInput(this, 0);
return true;
}

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
outAttrs.inputType = InputType.TYPE_CLASS_TEXT;
outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE;
// fullEditor is false, but we might set this to true for enabling
// text selection, and copy/paste. Lets see.
return new CustomInputConnection(this, true);
}
}

public class MainActivity extends Activity {
private CustomView view;

@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d("darkfi", "onCreate()");

super.onCreate(savedInstanceState);

//this.requestWindowFeature(Window.FEATURE_NO_TITLE);

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
//imm.showSoftInput(view, 0);
//imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 1);

view = new CustomView(this, imm);
setContentView(view);
}
}
Есть идеи, что не так?


Подробнее здесь: https://stackoverflow.com/questions/792 ... keyboard-i
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»