为什么我的Android自定义KeyboardView在设置新键盘后会溢出?

问题描述 投票:0回答:1

我正在开发安卓键盘。现在我想将键盘从字母更改为符号,然后用户按“123”按钮。 我的问题是,调用

keyboardView.setKeyboard()
后键盘溢出。

我尝试过的: 我记录了键盘的宽度。正常宽度是720,设置新键盘后,宽度是800多。 我还尝试打电话给

keyboardView.invalidate()
和i
nvalidateAllKEeys()
。两者都没有效果。 我复制粘贴了键盘 XML 布局以排除由布局引起的问题。

我该如何解决这个问题?

谢谢你帮助我。

Normal keyboard

keyboard after setting new keyboard

这是我的输入服务类

package com.luxaaa.keyboardtest.services;

@SuppressWarnings("deprecation")
public class MyInputMethodService extends InputMethodService implements 
KeyboardView.OnKeyboardActionListener {
private KeyboardView keyboardView;
private Keyboard keyboard, keyBoardSymbolic;
private boolean caps = false;

Vibrator vibrator;
VibrationEffect vEffect;

public MyInputMethodService() {
    super();
}

@Override
public View onCreateInputView() {
    LinearLayout layout =new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);

    View view =  getLayoutInflater().inflate(R.layout.keyboard_bar, null);


    // Keyboards
    keyboard =new Keyboard(this, R.xml.keys_layout);
    keyBoardSymbolic =new Keyboard(this, R.xml.keys_layout);

    keyboardView = (KeyboardView) getLayoutInflater().inflate(R.layout.keyboard_view, null);

    keyboardView.setKeyboard(keyBoardSymbolic);
   keyboardView.setOnKeyboardActionListener(this);
    keyboardView.setPreviewEnabled(false);



    layout.addView(view);
    layout.addView(keyboardView);

    vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

    return layout;
}

@Override
public void onPress(int primaryCode) {
    if(primaryCode != KeyEvent.KEYCODE_SPACE) {
        keyboardView.setPreviewEnabled(true);
    }

    // key feedback
    vibrator.vibrate(50);

    // set shift keys pressed if caps
   if(primaryCode == Keyboard.KEYCODE_SHIFT) {
       List<Keyboard.Key> keys = keyboard.getKeys();
       List<Keyboard.Key> keysSymbolic = keyBoardSymbolic.getKeys();
       for(Keyboard.Key key : keys) {
           if(key.codes[0] == primaryCode) {
               key.pressed = !caps;
           }
       }
       for(Keyboard.Key key : keysSymbolic) {
           if(key.codes[0] == primaryCode) {
               key.pressed = !caps;
           }
       }
   }

}

@Override
public void onRelease(int primaryCode) {
    keyboardView.setPreviewEnabled(false);
}

@Override
public void onKey(int primaryCode, int[] keyCodes) {
    InputConnection inputConnection = getCurrentInputConnection();
    if (inputConnection != null) {
        switch (primaryCode) {
            case Keyboard.KEYCODE_DELETE :
                CharSequence selectedText = inputConnection.getSelectedText(0);
                if(TextUtils.isEmpty(selectedText)) {
                    inputConnection.deleteSurroundingText(1,0);
                } else  {
                    inputConnection.commitText("", 1);
            }
                break;

            case Keyboard.KEYCODE_SHIFT :
                caps = !caps;
                keyboard.setShifted(caps);
                keyboardView.invalidateAllKeys();
                break;
            case Keyboard.KEYCODE_DONE :
                inputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
                break;

            case -10 :

                keyboardView.setKeyboard(keyboard);
                break;

                default:

                    char code = (char) primaryCode;
                    if(Character.isLetter(code) && caps) {
                        code = Character.toUpperCase(code);
                    }
                    inputConnection.commitText(String.valueOf(code), 1);
                break;
        }
    }

}

@Override
public void onText(CharSequence text) {

}


@Override
public void swipeLeft() {

}

@Override
public void swipeRight() {

}

@Override
public void swipeDown() {

}

@Override
public void swipeUp() {

}
}
java android xml layout
1个回答
0
投票

我遇到了同样的问题,我尝试将horizontalGap和verticalGap调整为较小的值,并且成功了。

© www.soinside.com 2019 - 2024. All rights reserved.