24

我们正在开发我们的第一个 android 应用程序,到目前为止,这是一次非常愉快的体验。它几乎完成了,但在发布之前我们有一些考虑,主要是关于 android 软键盘。

我们有几个 用于输入数字的EditText字段。我们希望在用户按下回车时捕获事件,并在此回调上进行一些计算并保存。

问题是我们没有得到一个固定的事件,因为不同的手机有不同的键盘。有些有“完成”按钮,我们的 HTC 手机有“输入”按钮。我们尝试将 imeOptions 用作“完成”,但这对 HTC 手机没有影响。

我们也知道可以通过点击后退按钮来关闭键盘。所以我的问题是,是否有一种可靠的方法可以知道用户何时停止输入或键盘何时隐藏,就像 iphone sdk 中的 textFieldShouldReturn 回调(当键盘关闭时它总是会触发,与导致它的键无关向下)..

换句话说,android 开发者如何处理软键盘?我在 editText onClick()事件上检查KeyEvent.KEYCODE_ENTER并在那里执行我的任务。它在我的 HTC android 上运行,但在我的朋友 Nexus 手机上运行,​​它有一个完成按钮而不是输入。甚至没有调用 onClick 。开发人员如何处理这个问题?

编辑:在我失去了一半的头发之后,在一些好朋友的帮助下

我已经尝试了您的所有建议,但最后通过使用 onEditorActionListener 和 onKeyListener方法为我解决了问题。在onEditorActionListener 的 onEdit 回调中,我检查了 KeyCode ACTION_DONE,它确实在带有完成按钮的键盘上被调用。在输入 onKey 的键盘上被调用。在 onKey 方法中,我还检查了 KEYCODE_BACK,以便也可以处理硬件后按事件。我还没有找到一个 android 设备完成并在键盘上输入(严重),但我什至用标志处理了这种情况。感谢@Femi 建议 onEditorActionListener,感谢所有朋友的帮助。但是我原来的问题的答案

问:是否有可靠且更简单的方法来了解 android 软键盘辞职(适用于每部手机的回调)

Ans :不,这里建议的所有方法和其他站点上建议的所有方法都不是直截了当的。而且我认为处理键盘返回键的事件是任何操作系统最基本的事情。谷歌,你在吗?

4

7 回答 7

7

由于您似乎正在捕获KEYCODE_ENTER事件,因此您可以使用它:http: //developer.android.com/reference/android/widget/TextView.html#setOnEditorActionListener%28android.widget.TextView.OnEditorActionListener%29 . 从理论上讲,这将让您检测输入法结束操作是什么(无论是返回、完成、输入还是其他)并对其做出响应。

让我知道这是否适合你。

于 2011-05-09T05:59:29.657 回答
2

当用户将 TextView 留在硬件键盘上时,您是否还需要执行这些计算?我不会专注于键盘,而是专注于 TextView 本身。如果是这样,您可能想要的是setTransformationMethod

您必须实现自定义TransformationMethod,特别是方法 getTransformation,它将源 CharSequence 转换为另一个。然后,您可以使用 onFocusChanged 仅在该 TextView 失去焦点时应用它。

于 2011-05-23T18:43:58.423 回答
1

我不敢相信谷歌在这种情况下没有独立于键盘的回调

哇,我也不敢相信。我目前有类似的问题。除了 IME 操作之外,我还检查了 EditFields 上的焦点变化。这在大多数情况下都很好,但并不总是有效。

我找到了一种在键盘被隐藏时收到通知的方法,但这还不是一个完整的解决方案(我不确定这是否是一个好主意),但我现在没有时间继续,所以我以为我可以在这里放弃这个想法的开始......:

编写您自己的 EditText(扩展 EditText)并覆盖onCreateInputConnection. 在您onCreateInputConnection返回您自己的实现时InputConnection(您可以简单地扩展 BasicInputConnection。当键盘被隐藏时(也当用户按下返回键时),始终调用 InputConnections“finishComposingText()”方法。

这是代码,也许其他人有一个想法,为什么输入的文本没有显示在这个编辑字段中;-)

public class MyEditText extends EditText{

public MyEditText(Context context) {
    super(context);
}

public MyEditText(Context context, AttributeSet attrs) {
    super(context);
}

public MyEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    System.out.println("onCreateInputConnection, "+outAttrs.actionId);
    return new MyInputConnection(this,true);
}

private class MyInputConnection extends BaseInputConnection{

    public MyInputConnection(View targetView, boolean fullEditor) {
        super(targetView, fullEditor);
    }

    @Override
    public boolean finishComposingText() {
        System.out.println("FINISH");
        return super.finishComposingText();
    }   
}
 }

摩根大通

于 2011-05-18T22:05:30.053 回答
1

我在这个 SO 页面上找到了一个解决方案: Intercept back button from soft keyboard

来自 mhradek 的答案有 0 票,但它似乎有效。

这个想法是扩展您的活动的基本布局,以便您可以覆盖 dispatchKeyEventPreIme 方法并针对传递的 KeyEvent 执行您想要的操作。请注意,您负责管理软键盘。

我正在使用它,我绝对可以在没有软键盘“吃掉”它们的情况下截取击键(例如后退按钮)。我还没有更多地使用它来看看什么是可能的,什么是不可能的。

我希望它有所帮助。

于 2011-05-21T22:40:13.960 回答
1

您是否尝试过实现自定义 EditText 视图,在其中覆盖 dispatchKeyEventPreIme?就像 Arnaud 发布的答案一样(从软键盘引用拦截后退按钮),但不使用自定义布局,而是使用自定义 EditText 并覆盖:

@Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {
    if(KeyEvent.KEYCODE_BACK == event.getKeyCode()) {
       //this hides soft keyboard in super.dispatchKeyEventPreIme(event)
    }
    return super.dispatchKeyEventPreIme(event);
}

我在这个问题中建议了这个解决方案

于 2011-05-23T12:00:28.863 回答
0

我没有尝试过,但是,阅读文档,这似乎是可能的。

//    From an activity, you can call

if (getResources().getConfiguration().keyboardHidden == Configuration.KEYBOARDHIDDEN_YES) {
// your code here
}
于 2011-07-08T09:32:52.170 回答
0

此代码适用于 HTC 和默认 Android 键盘:

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                // handle enter key on keyboard
                if (actionId == EditorInfo.IME_ACTION_SEND || 
                        (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN)) {
                    if (uid != null) {
                        // hide keyboard
                        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                        // perform other stuff

                        return true;
                    }
                }
                return false;
            }
        });

在 editText 的 XML 中使用以下内容:

android:imeOptions="actionSend"

当然你也可以使用其他东西,比如发送,只要确保在 XML 和 Java 代码中都改变它。

于 2011-10-12T14:43:10.817 回答