как изменить раскладку клавиатуры в андроиде, нажав клавишу Shift

В настоящее время я работаю над собственной реализацией Input Method Editor (IME) или может называться Softkeyboard в Android, я прочитал создание метода ввода, и я скачал the SoftKeyboard sample code provided as part of the SDK. У меня есть следующий код из пример программной клавиатуры:

private void handleCharacter(int primaryCode, int[] keyCodes) {
    if (isInputViewShown()) {
        if (mInputView.isShifted()) {
            primaryCode = Character.toUpperCase(primaryCode);
        }
    }
    if (isAlphabet(primaryCode) && mPredictionOn) {
        /**
         * Swapping here with my desired unicode character
         * */
        if (primaryCode >= 97 && primaryCode <= 122 ) {
            mComposing.append(Swap.swapLetters(primaryCode));
        }else{
            mComposing.append((char) primaryCode);
        }
        getCurrentInputConnection().setComposingText(mComposing, 1);
        updateShiftKeyState(getCurrentInputEditorInfo());
        updateCandidates();
    } else {
        getCurrentInputConnection().commitText(
                String.valueOf((char) primaryCode), 1);
    }
}

приведенный выше код работает нормально, но когда я нажимаю клавишу:

<Key android:codes="-1" 
            android:keyWidth="15%p" android:isModifier="true"
            android:isSticky="true" android:keyEdgeFlags="left"/>

что похоже на клавишу Shift, это преобразует клавиши в верхний регистр. Я не знаю, как показать мои следующие клавиши, эта клавиша нажата/нажата, следующее Logcat исключения:

Logcat исключения

Я проследил, что это может происходить в том месте, где мы обрабатываем ключ Shift:

private void handleShift() {
    if (mInputView == null) {
        return;
    }

    Keyboard currentKeyboard = mInputView.getKeyboard();
    if (mQwertyKeyboard == currentKeyboard) {
        // Alphabet keyboard
        checkToggleCapsLock();          
        mInputView.setKeyboard(mSindhi);            
    } else if (currentKeyboard == mSymbolsKeyboard) {
        mSymbolsKeyboard.setShifted(true);
        mInputView.setKeyboard(mSymbolsShiftedKeyboard);
        mSymbolsShiftedKeyboard.setShifted(true);
    } else if (currentKeyboard == mSymbolsShiftedKeyboard) {
        mSymbolsShiftedKeyboard.setShifted(false);
        mInputView.setKeyboard(mSymbolsKeyboard);
        mSymbolsKeyboard.setShifted(false);
    }
}

теперь я понятия не имею, как избавиться от исключения, упомянутого выше, и заставить мой код работать. Пожалуйста, решите это!


person Arshad Ali    schedule 13.02.2014    source источник


Ответы (1)


Могут быть и другие решения вашей проблемы, но я сделал один трюк и придумал следующее:

Шаг 1. Вы должны удалить все вызовы метода updateShiftKeyState(getCurrentInputEditorInfo()); в своем коде, например:

private void handleCharacter(int primaryCode, int[] keyCodes) {
if (isInputViewShown()) {
    if (mInputView.isShifted()) {
        primaryCode = Character.toUpperCase(primaryCode);
    }
}
if (isAlphabet(primaryCode) && mPredictionOn) {
    /**
     * Swapping here with my desired unicode character
     * */
    if (primaryCode >= 97 && primaryCode <= 122 ) {
        mComposing.append(Swap.swapLetters(primaryCode));
    }else{
        mComposing.append((char) primaryCode);
    }
    getCurrentInputConnection().setComposingText(mComposing, 1);
    //updateShiftKeyState(getCurrentInputEditorInfo()); // you can delete this method from your class and clean-up all the occurances of that 
    updateCandidates();
} else {
    getCurrentInputConnection().commitText(
            String.valueOf((char) primaryCode), 1);
}}

Шаг 2 измените свой метод handleShift на его:

private void handleShift() {
    if (mInputView == null) {
        return;
    }

    Keyboard currentKeyboard = mInputView.getKeyboard();
    if (mQwertyKeyboard == currentKeyboard) {           
        mInputView.setKeyboard(mSindhi);

    } else if (currentKeyboard == mSymbolsKeyboard) {
        mInputView.setKeyboard(mSymbolsShiftedKeyboard);
    } else if (currentKeyboard == mSymbolsShiftedKeyboard) {
        mInputView.setKeyboard(mSymbolsKeyboard);
    }
}

это все, надеюсь, это может сработать для вас...

person Community    schedule 14.02.2014