【问题标题】:Android: softkeyboard control on HTC desireAndroid:HTC 渴望的软键盘控制
【发布时间】:2010-09-30 21:20:14
【问题描述】:

我想要一个数字键盘,它有一个关闭和执行计算类的执行或完成按钮。感谢 commonware 关于从哪里开始的提示,我在模拟器上完美地工作了。然后我开始将它加载到我的 HTC 测试愿望中,它根本不起作用。我敢肯定这一定是因为 HTC 感觉拥有自己的 ime,但肯定有办法在 HTC 手机上进行这项工作?还有其他人设法解决了这个问题吗?

【问题讨论】:

    标签: keyboard htcsense android


    【解决方案1】:

    我可以复制我认为您在 HTC Incredible 上看到的内容。

    并非所有软键盘都支持 IME 操作按钮。有些,如 Graffiti 软“键盘”,可能根本没有按钮,更不用说 IME 操作按钮了。甚至Compatibility Definition Document 也没有说明设备随附的键盘需要这样的操作按钮。

    因此,您不应依赖 IME 操作按钮。如果它在那里,用户可以使用它。然而,无论你的目标是什么,总是有一些其他的方法来完成。

    【讨论】:

    • 所以你是说我最好的方法是创建自己的键盘,而不是 IME,而是视图?我确实有一个计算按钮,但它被键盘覆盖了。这很烦人,因为 HTC 键盘上的操作键在设置为 GO 时变为绿色,这很好,所以它明白它只是在 actionid 中返回 0。我开始认为自己创建一个小键盘是要走的路,但试图避免它?这是最好的方法吗?是否有任何关于 Android 最佳实践的文档是可读的?
    • 哦,顺便说一句,我终于订阅了。希望我能负担得起您在伦敦的一门课程,这将非常有用。可悲的是,我正试图通过反复试验同时学习 Java 和 android
    • @Dream Architect:“你是说我最好的方法是创建自己的键盘,而不是 IME,而是视图?” -- 对于普通应用程序,您只需将操作按钮等效为活动的一部分。对于计算器,无论如何您都将需要其他“键”(+、-、*、/ 等),因此您可能需要自己的按钮面板。在这种情况下,我会将数字键放在那个按钮面板中,就像普通计算器一样。
    • 那我可能走错路了。从这个意义上说,它不是计算器。这是一个程序,需要完成三个数字输入,然后执行一些特定的工程计算。当按下键盘上的 go 按钮时,iphone 版本会执行此操作,所以我试图模仿它。我确实有一个计算按钮,但它被键盘隐藏了。不过,我确信有办法绕过后者。
    • @Dream Architect:啊,好的。好吧,您仍然可以“模仿”“开始按钮”,但您需要另一种方法。用户可以通过按 BACK 关闭软键盘返回计算按钮。或者,您可以将计算按钮移动到屏幕上的其他位置。或者,您可以将整个表单包装在 ScrollView 中,这样用户即使在软键盘外露的情况下也可以向下滚动以到达计算按钮。这里有很多可能性,只取决于您特定的 GUI 设计。
    【解决方案2】:

    我正在使用 onEditorActionListener 检测是否已按下 DONE / GO / RETURN 按钮,但会检查 IME 选项和 KeyEvents 以覆盖 HTC 键盘以及任何接受 IME 选项的键盘。

    (此代码适用于 HTC Incredible 键盘以及任何具有 IME 选项的键盘)

    EditText.setOnEditorActionListener(new TextView.OnEditorActionListener(){
        public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event){
            if(actionId == EditorInfo.IME_ACTION_DONE 
                || actionId == EditorInfo.IME_NULL
                || event.getKeyCode() == KeyEvent.KEYCODE_ENTER){
    
                //Do something in here
                return true;
            } else {
                return false;
            }
        }
    });
    

    【讨论】:

    • 我担心,使用此代码 //Do something here 部分将被执行两次.. 你能检查一下吗?
    • 对我来说它得到 ERROR/AndroidRuntime(26336): FATAL EXCEPTION: main java.lang.NullPointerException ------ on string "if(actionId ==..."
    • 很适合我。感谢您的回答!
    • @Konsumierer 添加对if(event.getAction() == KeyEvent.ACTION_UP) 的检查以防止多次调用
    • java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“int android.view.KeyEvent.getKeyCode()”
    【解决方案3】:

    我使用的是带有 inputType="number" 的 EditText,并通过修改 Asha 的解决方案解决了这个问题:

    private TextView.OnEditorActionListener numberEnterListener = new TextView.OnEditorActionListener(){
            public boolean onEditorAction(TextView tv, int actionId, KeyEvent event){
                if(actionId == EditorInfo.IME_ACTION_DONE 
                    || actionId == EditorInfo.IME_NULL
                    || event.getKeyCode() == KeyEvent.KEYCODE_ENTER){
    
                    tv.clearFocus();
    
                    //Stupid keyboard needs to be closed as well
                    InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(tv.getWindowToken(), 0);
    
                    return true;
                } else {
                    return false;
                }
            }
        };
    

    为了停止显示数字键盘,已移除焦点。 imm 是必需的,因为即使在清除焦点后仍然存在软键盘。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2014-03-22
      • 2013-05-06
      • 2014-05-15
      相关资源
      最近更新 更多