【问题标题】:Turning off shift after typing key键入键后关闭移位
【发布时间】:2013-12-16 00:04:13
【问题描述】:

下面是我用来将OnKeyboardActionListener 添加到我的KeyboardView 的代码。 (为简洁起见,我省略了我留空的必需的重写方法。)

keyboardView.setOnKeyboardActionListener(new OnKeyboardActionListener() {

    private void shiftOn(boolean on) {
        System.out.println("Shifting " + (on ? "on" : "off"));
        keyboard.setShifted(on);
        shiftKey.icon = keyboard.isShifted() ? shiftLockDrawable : shiftDrawable;
    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {

        Editable editable = editText.getEditableText();
        int selectionStart = editText.getSelectionStart();

        if (primaryCode == SHIFT) {
            shiftOn(!keyboard.isShifted());
        } else {
            if (primaryCode == DELETE) {
                if (editable != null && selectionStart > 0) {
                    editable.delete(selectionStart - 1, selectionStart);
                }
            } else {
                editable.insert(selectionStart, Character.toString((char) primaryCode));
            }

            shiftOn(false);
        }
    }
});

问题

当我按下 shift 键时,一切都按预期进行;键的图标和“shiftedness”状态都发生了变化。

但是,当我按下任何其他键(应该关闭 shift)时,shiftness 的状态会变为 off,但图标不会变为 unshifted 版本。我在使用文本而不是图标时遇到了同样的问题。

我尝试在我的KeyboardView 上调用postInvalidate(),但无济于事。

这是一个video,它突出了我的问题。

【问题讨论】:

  • 您的 shiftOn() 方法是否有效。我的意思是你得到了 Shifting On/Off 的日志吗?

标签: java android keyboard shift


【解决方案1】:

我在shiftOn方法的末尾添加了以下代码:

keyboard.invalidateKey(SHIFT);

【讨论】:

    【解决方案2】:

    在我看来,重绘 shift 键是附加到实际输入事件的。你能代替改变 shiftKeyIcon 在代码中模拟 shift 键吗?当按下另一个键时,您只需生成一个额外的 shift 键按下事件。

    希望对你有帮助。

    【讨论】:

    • 我曾想过按键模拟是一种可能性,但我该怎么做呢?我在任何相关类中都没有看到这样的方法。
    【解决方案3】:

    我认为shiftOn() 有问题。我不完全知道 shiftLockDrawable 和 shiftDrawable 是做什么的,但也许下面的代码可以工作

    private void shiftOn(boolean on) {
        System.out.println("Shifting " + (on ? "on" : "off"));
        shiftKey.icon = (on ? shiftLockDrawable : shiftDrawable);
        keyboard.setShifted(on);
    }
    

    如果这不起作用或者这不是您想要的,您能否提供更多信息?

    【讨论】:

    • shiftLockDrawable 是 shift 开启时的图标, shiftDrawable 是 shift 关闭时的图标。这并没有解决问题,尽管使用 on 变量而不是 isShifted() 可能会更好。
    • 我运行了一个测试,使用shiftDrawableshiftLockDrawable 作为String。那工作得很好,所以错误不在这部分代码中。你用什么类来做图标?我认为这个类不会重绘您在视频中显示的图标,即使变量发生了变化。图标类有重绘方法吗?如果这不是问题,您是否尝试过逐步调试?像 Netbeans 和 Eclipse 这样的现代 Java IDE 让您可以调试程序。
    • 它们是可绘制对象
    • 在 [this]() 网站上我找到了 Drawable 的规范。在那里我找到了方法invalidateSelf()。如果这是正确的类,您可以在更改 Drawable 对象的状态后尝试调用此方法吗?
    猜你喜欢
    • 2018-12-24
    • 2012-01-02
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    相关资源
    最近更新 更多