windowsoftinputmode - android隐藏软键盘




知道Android软键盘何时退出的可靠方式(适用于每部手机的回调) (5)

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

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

问题是我们没有得到固定的事件,因为不同的手机有不同的键盘。 有些人有“完成”按钮,我们的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软键盘辞职(适用于每部手机的回调)

答:不,这里建议的所有方法和其他网站上建议的所有方法都不简单。 我认为处理键盘返回键的事件是任何操作系统最基本的事情。 谷歌,你呢?


我不能相信谷歌没有针对这种情况的键盘独立回调

哇,我不敢相信。 我现在遇到类似的问题。 除了IME ACTION,我还会检查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();
    }   
}
 }

JPM


使用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"

当然你也可以使用像send这样的东西,只要确保在XML和Java代码中都改变它。


您是否尝试过实现自定义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);
}

我在这个问题中提出了这个解决方案


我在这个SO页面找到了一个解决方案: 从软键盘拦截后退按钮

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

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

我正在使用它,我绝对可以拦截击键(例如后退按钮)而不用软键盘“吃”它们。 我还没有更多地玩它,以便看到什么是可能的,什么是不可能的。

我希望它有所帮助。


由于您似乎正在捕获KEYCODE_ENTER事件,因此您可以使用此命令: http://developer.android.com/reference/android/widget/TextView.html#setOnEditorActionListener%28android.widget.TextView.OnEditorActionListener%29http://developer.android.com/reference/android/widget/TextView.html#setOnEditorActionListener%28android.widget.TextView.OnEditorActionListener%29 。 理论上,这将让您检测输入方法的最终操作(无论是返回,完成,输入还是其他),并对其进行响应。

如果这对您有用,请告诉我。





soft-keyboard