Проблема всплывающей клавиатуры в Android, когда указаны ограничения столбцов - PullRequest
2 голосов
/ 19 февраля 2012

Я работаю над методом ввода для Android, и одной из задач является реализация настраиваемой всплывающей клавиатуры для жёстких нажатий клавиш. Обычно методы ввода позволяют редактору справиться с этим, но дело в том, что мне нужно добавить больше символов, чем поддерживает Android. Поэтому я реализовал всплывающую клавиатуру и даже хорошо отображал ее, когда жёсткая клавиша (символьная клавиша) долго нажата.

Шаги, которые я выполнил:

  1. Создать всплывающее окно.
  2. Накачайте линейную раскладку, которая содержит вид с клавиатуры и кнопку закрытия, и сохраните ее в виде объекта
  3. привязать вид клавиатуры и кнопки закрытия к соответствующим объектам
  4. Создайте клавиатуру для всплывающих символов и установите ее в качестве клавиатуры для представления клавиатуры. Клавиатура имеет ограничение колонки 5.
  5. установить линейный макет в качестве представления содержимого для всплывающего окна
  6. Отображение всплывающего окна

ПРОБЛЕМА: Если во всплывающей клавиатуре несколько строк, я могу выбрать только клавишу в последнем ряду для столбца. Даже если я нажму на ключ в первом ряду этого столбца, ключ в последнем ряду будет выбран. Если бы кто-нибудь мог объяснить, почему это происходит и как я могу это исправить, я был бы признателен.

КОД:

PopupWindow mPopupKeyboard = new PopupWindow(this.getBaseContext());            
mPopupKeyboard.setBackgroundDrawable(null);         


if(mPopupKeyboard != null)
{
    this.dismissPopupKeyboard();
    View mMiniKeyboardContainer = null;
    KeyboardView mMiniKeyboard = null;
    View closeButton = null;        
    mMiniKeyboardContainer = getLayoutInflater().inflate(R.layout.keyboard_popup_keyboard, null);        
    mMiniKeyboard = (KeyboardView) mMiniKeyboardContainer.findViewById(R.id.popup_keyboardView);
    closeButton = mMiniKeyboardContainer.findViewById(R.id.closeButton);
    if (closeButton != null) 
    {
        closeButton.setOnClickListener(new OnClickListener()            
        {
            @Override
            public void onClick(View arg0) 
            {
                mPopupKeyboard.dismiss();
        });
    }
    mMiniKeyboard.setOnKeyboardActionListener(this);

    String resourcestring = "abcdefghi";
    mMiniKeyboard.setKeyboard(new Keyboard(this.getBaseContext(), R.xml.kbd_popup_template, alternates, 3, 0));
    mMiniKeyboard.setPopupParent(mCandidateView);           
    mPopupKeyboard.setContentView(mMiniKeyboardContainer);
    mPopupKeyboard.setWidth(LayoutParams.WRAP_CONTENT);
    mPopupKeyboard.setHeight(LayoutParams.WRAP_CONTENT);
    mPopupKeyboard.showAtLocation(mCandidateView, Gravity.TOP, 0, 0);
}   

Ответы [ 2 ]

2 голосов
/ 27 сентября 2012

У меня была похожая проблема с всплывающими клавиатурами. Я обнаружил, что это проблема только с Android 2.3. Мой единственный обходной путь - избегать всплывающих клавиатур с несколькими строками.

0 голосов
/ 30 августа 2017

Причина, по которой это происходит, заключается в том, что KeyboardView отправляет MotionEvent. MotionEvent.getRawX () и getRawY () возвращают координаты только в пределах KeyboardView. Если MotionEvent происходит над KeyboardView, он возвращает ближайшие абсолютные координаты в KeyboardView.

Одним из решений является создание невидимого представления над KeyboardView. Он должен будет обнаружить MotionEvent и затем передать MotionEvent обратно в KeyboardView, и тогда ваша многорядная всплывающая клавиатура будет работать

Для начального кода посмотрите на CandidateViews над KeyboardView. Например, посмотрите на этот проект: https://github.com/blackcj/AndroidCustomKeyboard

В

 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 

(https://github.com/blackcj/AndroidCustomKeyboard/blob/master/app/src/main/java/com/blackcj/customkeyboard/CandidateView.java)

метод добавляет 200 к требуемому весу в этом утверждении:

   setMeasuredDimension(measuredWidth, resolveSize(desiredHeight, heightMeasureSpec)); 

Обратите внимание, как это заставит motionEvent.getRawY () работать на дополнительные 200p в высоту

...