2015-01-09 1 views
2

В текущем полноэкранном проекте на основе opengl, над которым я работаю, у меня есть некоторые графические элементы на основе GL, в частности текстовое поле ввода. Для ввода текста, когда этот элемент имеет фокус, я показываю мягкую клавиатуру (которая выглядит нормально).Мягкая клавиатура Android Lollipop не принимает нажатия клавиш с поверхностью GL

В версии для Android до 5.0 клавиатура Google отлично работает, отправляя ключевые события, например, для аппаратных клавиатур. На android Lollipop некоторые другие клавиатуры, такие как Swiftkey или свободная клавиатура Hacker, все еще работают, но Google Keyboard больше нет.

При нажатии клавиши на клавиатуре Google на Lollipop визуальная обратная связь не появляется на самой клавиатуре, и мое приложение получает события касания, как если бы клавиатура не отображалась (но это так). Тем не менее, ключ «hardware» работает нормально.

Вид, используемый в приложении, представляет собой SurfaceView (и это не TextView). Я переопределил onCheckIsTextEditor, и я возвращаю InputConnection от onCreateInputConnection, где я установил inputType как TYPE_NULL. Обратите внимание, что onCreateInputConnection, похоже, не называется.

Это приложение скомпилировано с использованием совместимости с уровнем 15 для Android.

Любая идея, что помешало бы клавиатуре принимать события касания? Что делать, чтобы отлаживать поток событий прикосновений?

ответ

1

Я, наконец, нашел обходной путь к моей проблеме, хотя я не совсем понимаю, почему он работает. Это решение частично основано на том, что Cocos2d-x делает для ввода на Android.

Я создал андроид EditText (на самом деле класса, чем наследует EditText, в котором я отменяю onKeyUp и onKeyDown, это отслеживать фокусировку и ключ обратно).

Вместо того, чтобы в SurfaceView единственный элемент деятельности, я создал макет, который имеет поддельный редактировать текст в фоновом режиме (но не во весь экран), и SurfaceView на вершине:

private FrameLayout setupView(View androidView) 
{ 
    ViewGroup.LayoutParams framelayout_params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,                                     ViewGroup.LayoutParams.MATCH_PARENT); 
    frameLayout = new FrameLayout(this); 
    getFrameLayout().setLayoutParams(framelayout_params); 

    ViewGroup.LayoutParams edittext_layout_params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,                               ViewGroup.LayoutParams.WRAP_CONTENT); 

    edittext = new FakeEditText(this); 
    edittext.setLayoutParams(edittext_layout_params); 

    // make sure this edit text is not fullscreen 
    edittext.setImeOptions(EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_FLAG_NO_EXTRACT_UI); 

    // ...add to FrameLayout 
    frameLayout.addView(edittext); 
    frameLayout.addView(androidView); 
    return frameLayout; 
} 

Я также добавил TextWatcher, связанный с поддельным текстом редактирования, это в основном для захвата текста, введенного пользователем, и отправки его обратно в текст редактирования на основе GL, который у меня есть на SurfaceView (в моем случае, когда вызывается метод afterTextChanged, Я преобразовываю полученные символы во внутренние события keydown/keyup, которые перенаправляются на мой контроль GL).

Когда виртуальная клавиатура должна отображаться (например, когда текстовое поле GL имеет фокус), я устанавливаю поддельное текстовое текстовое содержимое из содержимого текстового поля GL и прикрепляю этот текст TextWatcher к тексту фальшивого редактирования и присоединяем виртуальная клавиатура для фальшивого текста редактирования Android.

// Control is the base class of my GL controls 
private void uiShowVirtualKeyboard(Control control) 
{ 
    if (fakeEdit.requestFocus()) { 
    // textWrapper is our TextWatcher 
    fakeEdit.removeTextChangedListener(textWrapper); 
    fakeEdit.setText(""); 

    // get the text from the GL Text entry 
    final String text = control.getTextContent(); 

    // and make sure it's in the android EditText at start 
    fakeEdit.append(text); 

    // listen to user changes 
    fakeEdit.addTextChangedListener(textWrapper); 

    // show the virtual keyboard 
    InputMethodManager imm = (InputMethodManager) fAndroidActivity.getSystemService(Context.INPUT_METHOD_SERVICE); 
    imm.showSoftInput(fakeEdit, InputMethodManager.SHOW_FORCED); 
    } 
} 
0

У меня была точно такая же проблема. Клавиатура Google не отображалась правильно и прошла сенсорный ввод через его кнопки.

Как оказалось, клавиатура Google недовольна настройками по умолчанию EditorInfo класса, переданного в onCreateInputConnection для просмотра. Если вы заполните не менее imeOptions поле и оставьте остальные значения по умолчанию, они будут работать, даже если вы вернете null из функции.

Для того, чтобы исправить это я добавил эти строки в моей SurfaceView подкласса:

@Override 
public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 
    outAttrs.inputType = InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE | InputType.TYPE_CLASS_TEXT; 
    outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_FULLSCREEN; 
    return super.onCreateInputConnection(outAttrs); 
} 
Смежные вопросы