如何从软键盘上按下“完成”按键

时间:2010-06-13 10:33:50

标签: android

如何从软键盘捕获特定的键事件? 特别是我对“完成”键感兴趣。

12 个答案:

答案 0 :(得分:58)

我不太确定在接受的答案中使用了哪种听众。 我使用了附加到OnKeyListener的{​​{1}},它无法捕捉到下一个也没有。

但是,使用EditText工作,它还允许我通过将操作值与定义的常量OnEditorActionListenerEditorInfo.IME_ACTION_NEXT进行比较来区分它们。

EditorInfo.IME_ACTION_DONE

答案 1 :(得分:38)

@ Swato的答案对我来说并不完整(并且没有编译!)所以我正在展示如何对DONE和NEXT动作进行比较。

editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
        int result = actionId & EditorInfo.IME_MASK_ACTION;
        switch(result) {
        case EditorInfo.IME_ACTION_DONE:
            // done stuff
            break;
        case EditorInfo.IME_ACTION_NEXT:
            // next stuff
            break;
        }
    }
});

另外我想指出,对于JellyBean,需要更高的OnEditorActionListener来监听'enter'或'next'而你不能使用OnKeyListener。来自文档:

  

由于软输入法可以使用多种创造性的输入文本方式,因此无法保证软键盘上的任何按键都会产生关键事件:这由IME自行决定,实际上是发送不鼓励这样的事件。您不应该依赖于接收软输入法上任何键的KeyEvent。

参考:http://developer.android.com/reference/android/view/KeyEvent.html

答案 2 :(得分:29)

注意:这个答案很旧,不再适用。请参阅下面的答案。

您捕获KeyEvent,然后检查其密钥代码。 FLAG_EDITOR_ACTION用于识别来自IME的输入密钥,其输入密钥已被自动标记为“下一个”或“已完成”

if (event.getKeyCode() == KeyEvent.FLAG_EDITOR_ACTION)
    //your code here

查找文档here

答案 3 :(得分:10)

就这样做:

editText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if(actionId == EditorInfo.IME_ACTION_DONE)
    {
       //Do Something
    }

    return false;
}
});

答案 4 :(得分:8)

    etSearchFriends = (EditText) findViewById(R.id.etSearchConn);
    etSearchFriends.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                (keyCode == KeyEvent.KEYCODE_ENTER)) {
                Toast.makeText(ACTIVITY_NAME.this, etSearchFriends.getText(),Toast.LENGTH_SHORT).show();
              return true;
            }
            return false;
        }

    }); 

答案 5 :(得分:2)

要抓住“完成”键,请按软键盘覆盖Activity的onKeyUp方法。 为视图设置OnKeyListener侦听器将不起作用,因为在软件输入方法中按键通常不会触发此侦听器的方法,在视图中按下硬件键时将调用此回调。

// Called when a key was released and not handled by any of the views inside of the activity. 
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_ENTER:
            // code here
            break;
        default:
            return super.onKeyUp(keyCode, event);
    }
    return true;
}

答案 6 :(得分:1)

我有EditText搜索名称,它会自动在ListView中显示以下结果。 SoftInput键盘仅显示" next"按钮并输入标志 - 没有做任何事情。我只想要完成按钮(没有下一个或输入标志),我也想要它按下它,它应该关闭键盘,因为用户应该看到它下方的结果。

我在Cyril Mottier先生的博客上找到的解决方案非常简单,无需任何额外代码即可使用: 在EditText所在的xml中,应该写入: 机器人:imeOptions =" actionDone"

使用Done按钮隐藏键盘,EditText应该如下所示:

<EditText
        android:id="@+id/editText1central"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/imageView1"
        android:layout_toLeftOf="@+id/imageView2tie"
        android:ems="10"
        android:imeOptions="actionDone"
        android:hint="@string/trazi"
        android:inputType="textPersonName" />

答案 7 :(得分:1)

注意:在您的edittext中提及输入类型。

<EditText android:id="@+id/select_category" 
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text" >

edittext.setOnEditorActionListener(new OnEditorActionListener() {

            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

                if ((actionId & EditorInfo.IME_MASK_ACTION) == EditorInfo.IME_ACTION_DONE) {
                    //do something here.
                    return true;
                }
                return false;
            }
        });

答案 8 :(得分:1)

您可以通过以下方法覆盖已完成的键事件:

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // do your stuff here
        }
        return false;
    }
});

答案 9 :(得分:0)

IME_MASK_ACTION为255,而收到的actionId为6,我的编译器不接受

if (actionId & EditorInfo.IME_MASK_ACTION) 

这是一个int。无论如何,&amp; -ing 255的用途是什么?所以测试可以是

public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (actionId == EditorInfo.IME_ACTION_DONE)
    ...

答案 10 :(得分:0)

editText = (EditText) findViewById(R.id.edit_text);

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            // code here
        }
        return false;
    }
});

答案 11 :(得分:0)

KOTLIN 版本:

<EditText android:id="@+id/edit_text" 
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:inputType="text" />

不要忘记设置android:inputType。

// Get reference to EditText.
val editText = findViewById<EditText>(R.id.edit_text)

editText.setOnEditorActionListener { _, actionId: Int, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Do your logic here.
        true
    } else {
        false
    }
}