在Android上自定义键盘中禁用一个按键

11

我在我的Android应用中有一个自定义键盘。它的布局以以下xml的形式描述:

<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"">
 <Row>
     <Key android:keyLabel="F1" android:keyOutputText="F1"/>
     <Key android:keyLabel="F2" android:keyOutputText="F2"/>
     <Key android:keyLabel="F3" android:keyOutputText="F3"/>
...

我想知道如何禁用某些按键,比如“F1”键,并使其变成灰色且不能触摸。

这里有一些类似的问题,但都关于默认软键盘。

我知道可以像这样遍历按键:

for (Keyboard.Key key : myKeyboard.getKeys())

但是看起来Keyboard.Key类的对象对于更改按键外观来说是毫无用处的。

更新:我没有找到解决方案。我手动实现了键盘 - 大号相对布局,普通按钮和自定义按钮,一切都很好。顺便说一句 - 自定义键盘至少更漂亮。只需从droid 4+复制资源 - 您将获得漂亮的现代透明按钮和每个平台上的透明布局。


@thelawnmowerman 你是想根据其他条件动态禁用该键,还是始终禁用它? - jerry
一直都是这样!应该更容易些 :-) - thelawnmowerman
@thelawnmowerman 我不确定这是否可行,但是您可以尝试编辑XML以添加“keyIcon”(并将其设置为清晰表明按钮已禁用的图像),并将“keyOutputText”修改为空字符串。 - jerry
谢谢你的想法,但它行不通,因为keyIcon属性只会改变按钮的“表面”图标,而不是按钮本身。按钮的边框仍然保持不变,并且触摸效果仍然有效:-( 另一方面,我可以为所有按钮指定自定义可绘制对象,但那将是无用的,因为我需要大多数按钮保持原样,只有一些禁用... - thelawnmowerman
这些键与onKey()中的按键代码有什么关联? - Shark
显示剩余4条评论
3个回答

1
通常只有在编辑某些内容时,键盘才会出现,因此您可以通过对象捕获编辑。如果它是一个editText框,那么您可以添加一个监听器,然后禁用对editText的任何响应。我不确定这对您是否有用,但至少您可以捕获任何不需要的输入。
    // add a keylistener to keep track user input
    editText.setOnKeyListener(new View.OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // if keydown and "enter" is pressed
            if ((event.getAction() == KeyEvent.ACTION_DOWN)
                    && (keyCode == KeyEvent.KEYCODE_ENTER)) {

                // do some thing or nothing

                return true;

            }

            return false;
        }
    });

1
我目前使用android:horizontalGap来放置一个黑色间隙(与键的宽度相同),在应该放置禁用键的位置上(通过这种方式,我可以隐藏每个屏幕中不允许使用的按键,因为我的键盘始终具有相同的分布)。虽然这是一种不理想的解决方法。
主要问题出现在最右边的键上,因为android:horizontalGap只能设置在键的左侧。但是,在最右边的伪造键中使用android:keyWidth="0"属性,然后在那里设置适当的android:horizontalGap,就可以解决问题。这是一种更差的解决方法...
有更好的解决方案吗?

-3
如果 Key 是一个按钮,那么它很简单:
key.setEnabled(false);

否则,将其设置为不可点击状态:
key.setClickable(false);

...并改变它的外观(背景颜色,文字颜色等)。最简单的方法是:

key.setBackgroundColor("0xFFAAAAAA");

你的意思是什么?我不知道 Key 继承自哪个类。它可能是 Button 的子类,也可能是 View 的子类。当然,View 没有像 Button 那样多的便捷方法。 - Eric Weiss
1
我的意思是,键的超类并不是什么秘密,它是Object。键盘是一个视图,但没有“disable(key)”或类似的东西。 - mjollneer
1
假设并没有真正帮助,特别是在这种情况下,建议根本不适用。 - homerman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接