Клавиатура Android KeyBoard. Клавиша отключена? Просмотр специальных клавиш? - PullRequest
5 голосов
/ 18 ноября 2011

Я настраиваю свою собственную программную клавиатуру, реализуя интерфейс KeyboardView.OnKeyboardActionListener.

При нажатии клавиш отображается всплывающее окно предварительного просмотра.

Моя проблема в том, как отключить всплывающее окно предварительного просмотра для специальных клавиш, таких как SHIFT и DELETE?

Я попытался установить для атрибута android: iconPreview значение null, но оно не сработало.

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

Есть идеи?

Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 26 ноября 2011

Сначала вы должны реализовать OnKeyboardActionListener

затем используйте onPress () и onRelease () для управления всплывающим окном предварительного просмотра, например:

public void onPress(int primaryCode) {
    if (primaryCode==-2||primaryCode==-5||primaryCode==-4){
        mInputView.setPreviewEnabled(false);
    }
}

public void onRelease(int primaryCode) {
    mInputView.setPreviewEnabled(true);
}
2 голосов
/ 21 октября 2015

public void onCreate() {

    mInputView.setPreviewEnabled(false);

}

public void onPress(int primaryCode) {
    if (primaryCode==-1||primaryCode==-2||primaryCode==-5||primaryCode==-4){

    } else {
       mInputView.setPreviewEnabled(true);
    }
}

public void onRelease(int primaryCode) {
    mInputView.setPreviewEnabled(false);
}
0 голосов
/ 23 ноября 2018

Проблема с вышеупомянутым решением, как прокомментировано, состоит в том, что

, если я нажимаю другую клавишу (например, клавишу A) и перемещаю палец к клавише SHIFT, значок предварительного просмотра все еще всплывает

Чтобы противостоять этому, мне пришлось расширить KeyboardView class Disclaimer - ниже содержится отражение api

Вот модифицированный класс Keyboard

import android.content.Context
import android.inputmethodservice.KeyboardView
import android.os.Build
import android.support.annotation.RequiresApi
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
import android.widget.TextView
import com.continental.testapplication.utils.dpToPx
import java.lang.reflect.Method

class ModifiedKeyboardView :KeyboardView{
    constructor(context: Context, attrs: AttributeSet):super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr:Int):super(context, attrs, defStyleAttr)
    @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr:Int, defStyleRes:Int):
            super(context, attrs, defStyleAttr, defStyleRes)

    /**
     * Return true, if preview is to be shown, false otherwise. If not implemented,
     * the preview is going to be shown.....
     */
    var keyPreviewIndexListener:((Int)->Boolean) ?= null

    private val findKeyIndicesMethod:Method = KeyboardView::class.java.getDeclaredMethod(
            "getKeyIndices",Int::class.java,Int::class.java, (IntArray::class).java).also {
        it.isAccessible = true
    }
    private val previewText:TextView = KeyboardView::class.java.getDeclaredField(
            "mPreviewText").let {
        it.isAccessible = true
        it.get(this) as TextView
    }


    override fun onTouchEvent(me: MotionEvent?): Boolean {
        if(me == null) return super.onTouchEvent(me)
        when(me.action){
            MotionEvent.ACTION_DOWN -> isPreviewEnabled = true
            MotionEvent.ACTION_MOVE -> {
                val touchX = me.x - paddingLeft
                var touchY = me.y.toInt() - paddingTop
                val verticalCorrection = dpToPx(14f, context)
                if (touchY >= -verticalCorrection)
                    touchY += verticalCorrection.toInt()

                val keyIndex:Int = findKeyIndicesMethod.invoke(this, touchX.toInt(), touchY.toInt(), null) as Int

                    isPreviewEnabled = keyPreviewIndexListener?.invoke(keyIndex)?:true
                    if(!isPreviewEnabled){
                        previewText.visibility = View.INVISIBLE
                    }


            }
        }
        return super.onTouchEvent(me)
    }
}

Вставьте его как есть.

Далее, в классе, где вы манипулируете клавиатурой,

 keyboardView.keyPreviewIndexListener = {
            it != spaceIndex && it != doneIndex && it != deleteIndex && it != `your_custom_index`
        }

Чтобы найти индексы, вы можете просто сделать следующее

 doneIndex = keyboardView.keyboard.keys.indexOfFirst {
            it.codes[0] == Keyboard.KEYCODE_DONE
        }

Это предотвратит движение.Пожалуйста, добавьте другое решение также.то есть

override fun onPress(primaryCode: Int) {
            Log.e("onPress", primaryCode.toString())
            checkAndActivatePreview(primaryCode)

        }

        override fun onRelease(primaryCode: Int) {
            Log.e("onRelease", primaryCode.toString())
            deactivatePreview()
        }

 private fun checkAndActivatePreview(primaryCode: Int) {
        keyboard.isPreviewEnabled =
                (primaryCode != `your_custom_code`
                && primaryCode != SPACE_KEY_CODE && primaryCode != Keyboard.KEYCODE_DELETE
                && primaryCode != Keyboard.KEYCODE_DONE)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...