显示软键盘时,返回键的Android键事件?

时间:2013-10-28 14:21:17

标签: android android-softkeyboard

我正在尝试在显示软键盘时捕获“后退”键事件。

我正在使用SDK ver 8,并且只有在软键盘为HIDDEN时才能成功捕获后退键事件,如下所示:

@Override
public void onBackPressed() {
    // do something
    super.onBackPressed();
}

问题是系统在显示软键盘时没有调用此方法。我试图登录KeyDown / Up()方法以及上面的方法来解决这个场景中发生的事情无济于事。见下文:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    //DEBUGGING
    Log.d(TAG + "KeyUP", String.valueOf(event));
}

按预期返回音量和菜单键的日志,但仅在隐藏软键盘和菜单时才会记录后退键。

是否有任何可以解释这种现象的“背键”大师?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:11)

以下是捕获按键事件的方法:  1.扩展editText视图以覆盖onKeyPreIme

package com.test.test;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.EditText;

/**
 * Created by sumit.saurabh on 11/10/16.
 */
public class ChatEditText extends EditText
{
    /* Must use this constructor in order for the layout files to instantiate the class properly */
    public ChatEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    private KeyImeChange keyImeChangeListener;

    public void setKeyImeChangeListener(KeyImeChange listener)
    {
        keyImeChangeListener = listener;
    }

    public interface KeyImeChange
    {
        public void onKeyIme(int keyCode, KeyEvent event);
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event)
    {
        if (keyImeChangeListener != null)
        {
            keyImeChangeListener.onKeyIme(keyCode, event);
        }
        return false;
    }
}
  1. xml中的ChatEditText

        <com.test.test.ChatEditText
            android:id = "@+id/messageEditText"
            android:layout_width = "match_parent"
            android:layout_height = "wrap_content"
            android:layout_gravity = "bottom"
            android:layout_marginLeft = "12dp"
            android:layout_marginRight = "30dp"
            android:background = "@null"
            android:hint = "Type your message"
            android:inputType = "textMultiLine"
            android:singleLine = "false"
            android:textColorHint = "#c4c0bd"
            android:textSize = "18sp"/>
    
  2. 然后将一个监听器(setKeyImeChangeListener)附加到编辑文本:

    private ChatEditText messageEditText;
    messageEditText =
       (ChatEditText) findViewById(R.id.messageEditText);
    
    messageEditText.setKeyImeChangeListener(new ChatEditText.KeyImeChange(){
        @Override
        public void onKeyIme(int keyCode, KeyEvent event)
        {
            if (KeyEvent.KEYCODE_BACK == event.getKeyCode())
            {
                // do something
            }
        }});
    

答案 1 :(得分:6)

在此网站和Android API上进一步挖掘后,我发现了

KeyEvent.KEYCODE_BACK

被具有输入法连接的IME捕获并吞噬,并且当前显示该输入方法(换句话说,软键盘未被隐藏)。这意味着在系统调用Activity类onKeyDown()或onKeyUp()方法之前消耗该事件。

要解决此问题,请创建IME小部件的子类(TextView或其子类,如EditText)并实现onKeyPreIme()

Stack user i2097i发布了一个很好的解决方案,可以在活动here中实现onKeyPreIme()。 如果您希望保留Androids默认行为(即关闭键盘),请确保在onKeyPreIme()覆盖中返回FALSE。

答案 2 :(得分:0)

通常后退按钮会隐藏键盘(原生行为),所以不要用它做任何事情