如何使用 onBackPressed() 显示 SoftKeyboard 来完成()活动

Posted

技术标签:

【中文标题】如何使用 onBackPressed() 显示 SoftKeyboard 来完成()活动【英文标题】:How to finish() an activity with SoftKeyboard visible with onBackPressed() 【发布时间】:2016-02-13 20:23:19 【问题描述】:

我有一个活动,整个屏幕都专门用于发送一条消息。上半部分是一个 EditText,下半部分始终可见 SoftKeyboard。 当我按回时,软键盘隐藏,我必须再次按回才能离开活动。

我正在努力获得的行为是:当我按下后退按钮时立即完成活动,而不是隐藏键盘。 例如,在撰写新推文时,您可以在 twitter 应用中发现这种行为。

我尝试覆盖 onBackPressed() 函数,但似乎当键盘可见时,该函数没有被调用。

@Override
public void onBackPressed() 
     finish();

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

所以在尝试了很多事情之后,这里的一些工作:

子类 EditText 并覆盖 onKeyPreIme() 函数以发送回调。 这是子类的代码:

OnKeyPreImeListener onKeyPreImeListener;

public void setOnKeyPreImeListener(OnKeyPreImeListener onKeyPreImeListener) 
    this.onKeyPreImeListener = onKeyPreImeListener;


@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) 
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) 
        if(onKeyPreImeListener != null)
            onKeyPreImeListener.onBackPressed();
        Log.d(TAG, "HIDING KEYBOARD");
        return false;
    
    return super.dispatchKeyEvent(event);


public interface OnKeyPreImeListener 
    void onBackPressed();

然后在每个 TextView 的活动中:

EditTextGraphee.OnKeyPreImeListener onKeyPreImeListener = 
        new EditTextGraphee.OnKeyPreImeListener() 
        @Override
        public void onBackPressed() 
            Log.d(TAG, "CALL BACK RECEIVED");
            MyActivity.this.onBackPressed();
        
    ;
editText.setOnKeyPreImeListener(onKeyPreImeListener);

【讨论】:

【参考方案2】:

新答案:

显然您没有收到onBackPressed 回调,但这并不意味着您无法检测到键盘关闭。

使用此处描述的技术:How to check visibility of software keyboard in android?

您可以检测键盘何时打开/关闭,因此当键盘关闭时您调用finish();

已弃用,原始答案:

只需覆盖活动中的后按事件:

@Override
public void onBackPressed() 
   super.onBackPressed();
   finish();

【讨论】:

是的,我以前也试过!它是“一种”工作,它在键盘隐藏时触发,但在显示时以及其他一些更随机的事件时也会触发。我现在找不到如何确保由于隐藏的键盘而不是其他原因触发了此事件。 在那个答案上,代码非常“简单”。我在要点上分享了我用于键盘检测器的代码,它非常可靠。 gist.github.com/anonymous/1d5fee1d25c1f1b04dbb试试看 非常感谢,我实际上找到了另一种让它工作的方法!最后 !我会发在这里【参考方案3】:

我假设由于软键盘是可见的,因此编辑文本可能具有焦点。因此,您可以通过在该 EditText 上添加 OnEditorActionListener 并完成活动来捕获后按事件。

yourEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() 
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) 

                if (event.getAction() == KeyEvent.ACTION_UP)

                    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK)
                        finish();
                    

                
                return false;

            
        );

【讨论】:

试过了,没有结果。也尝试了onKeyListener,但只有在键盘已经隐藏时才调用,同样的问题很遗憾:-(。 你说得对,这行不通我会看看我是否找到其他方法【参考方案4】:

你需要扩展 EdtText 类并实现 onKeyPreIme 方法。

public class MyEditText extends EditText 
/* Must use this constructor in order for the layout files to instantiate the class properly */
public MyEditText(Context context, AttributeSet attrs)

    super(context, attrs);
    // TODO Auto-generated constructor stub


@Override
public boolean onKeyPreIme (int keyCode, KeyEvent event)

    // do your stuff here.
    return true;

【讨论】:

很遗憾没有,我试过了,即使我在这个函数中放了一个 Log,它只是在键盘可见时不会调用 onBackPressed。【参考方案5】:

像这样覆盖 onBackPressed() 方法:

 @Override
public void onBackPressed() 
   hideKeyboard();
   finish();

hideKeyboard()函数请上网搜索

【讨论】:

试过了,但问题似乎是它没有在这个活动上调用 onBackPressed() 。它被调用的唯一时刻是当我快速点击两次后退按钮时。如果我点击一次,键盘就会隐藏并且它不会调用 onBackPressed(),如果我在键盘隐藏后稍等片刻,它会完成 () 活动,但甚至不会调用 onBackPressed() 函数。

以上是关于如何使用 onBackPressed() 显示 SoftKeyboard 来完成()活动的主要内容,如果未能解决你的问题,请参考以下文章

onbackpressed 数据未显示在片段中

显示 ProgressDialog 并在一段时间后调用 OnBackPressed()

如何在 Fragments 中实现 onBackPressed()?

在活动中使用 OnBackPressed 方法的一个片段到另一个片段

在可序列化之后使用 onBackPressed() 发回列表

onBackPressed() 覆盖