在安卓键盘上检测返回事件

12

我有一些意图在选项卡控制器中,其中一个是编辑文本,我需要确定它何时具有焦点以及何时失去焦点。

我已经映射了大部分事件,如焦点监听器,OnEditorActionListener等,现在我唯一的问题是当我拥有焦点时软键盘出现,我想通过以下方式关闭它:

  1. 使用“完成”按钮而不是手机上的返回按钮(在键盘可见时禁用返回按钮以关闭键盘)
  2. 检测到在键盘可见时的返回按钮事件,以便我可以将焦点传递给其他控件。

我已经尝试了多种方法,但都没有成功,例如onBackPressed,onConfigurationChanged(在清单文件中添加hiddenKeyboard),key_down on activity等,但都没有成功。

有人成功过吗?实际上,当键盘可见且我在手机上按下返回按钮时,我希望我的编辑文本失去焦点(otherControl.requestFocus ->是一个相对布局)。


请展示一下你目前尝试过的内容。 - confucius
  1. 这个
txtSearchBar.setOnEditorActionListener(new EditText.OnEditorActionListener() {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (event.getKeyCode() == KEYCODE_BACK) { layoutFocus.requestFocus();
} return false; } });
  1. 在onBackPressed方法中使用第二种方法,即layoutFocus.requestFocus();
  2. 在清单文件中为此活动添加hiddenKeyboard,并放置以下代码:
@Override public void onConfigurationChanged(Configuration newConfig)
- Catalin
不能再添加代码了,因为如果我的声望超过100分,我就无法回答我的问题 :) - Catalin
你可以在问题编辑中发布代码 - AAnkit
@Catalin:你试图劫持原生的安卓用户体验,虽然有方法可以实现,但老实说,用户不会喜欢你应用的这种行为。 - Pratik Bhat
你好,我的想法是当编辑文本框获得焦点并且失去焦点时,我想要对布局进行动画处理,但是由于返回键通常会隐藏键盘但不会失去控件的焦点,所以我无法完成这个功能。也许你知道其他的解决方法。 - Catalin
3个回答

13

虽然这个话题比较老,但以下是期望的答案。

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
        Toast.makeText(getContext(), "BACK", Toast.LENGTH_SHORT).show();
        return true;
    }
    return super.onKeyPreIme(keyCode, event);
}

你应该把这个放在一个类里,这个类要继承EditText(如:class MyEditText extends EditText...)


7

以下是捕获后退键事件的方法: 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;
    }
}

2. 在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"/>

3. 然后可以从任何地方添加一个监听器,像这样:

 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
        }
    }});

3

这是它。

 @Override
public boolean dispatchKeyEvent(KeyEvent event) {
      if(event.getKeyCode() == KeyEvent.KEYCODE_BACK)
     {  //do you back event work here
           }    
    return super.dispatchKeyEvent(event);
}

2
感谢你的代码,但很遗憾它不起作用:( 使用你的方法,只有在软键盘已经隐藏(我按下完成按钮后)时,才会捕获返回键,并且退出程序。当键盘显示并按下返回键时,它执行键盘隐藏,但不通过这个方法。我正在测试Android 2.2和2.3版本。 - Catalin
1
是的,因为当您按下返回键并且键盘弹出时,只有键盘活动会监听到该事件并返回。只有在用户在您的活动中按下返回键时,您才能听取返回事件,在这种情况下,键盘活动会监听此返回事件。 - AAnkit
有没有办法跟踪键盘活动的返回?或者在键盘弹出时禁用返回按钮的工作?类似于子类化编辑文本并更改一些内容?这是可能的吗? - Catalin
1
是的,您可以阻止原生键盘,创建自己的自定义软键盘,并在返回键按下时执行任何操作。这并不复杂,但有些棘手。我知道它是可行的。在自定义键盘上进行一些谷歌搜索,您就可以完成它。 - AAnkit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接