当前位置: 首页 > 知识库问答 >
问题:

在片段中显示/隐藏软键盘事件

糜宜民
2023-03-14

有很多关于查找显示/隐藏软键盘事件的帖子。我发现自己的处境是,我需要根据软键状态在片段中更改图标

我试图实现onMeasure,但我无法在片段中覆盖它。是否有一种(相对)无痛的方式可以在我的片段中获得清晰的显示/隐藏软键盘事件,或者我应该放弃?

共有2个答案

弘浩博
2023-03-14

经过一番努力,我终于能够抽象出一种方法,每当我需要显示或隐藏键盘时,我都可以调用它,而不必使用show_。我在许多答案中看到,即使在没有文本输入的新活动中,键盘也会打开。

我在onGlobalLayout中使用了这段代码来检查键盘是否打开,然后在我的方法中我决定是打开还是关闭。

代码如下:

要检查它是否打开:

private static boolean isKeyboardVisible(Activity activity) {
    Rect r = new Rect();
    View contentView = activity.findViewById(android.R.id.content);
    contentView.getWindowVisibleDisplayFrame(r);
    int screenHeight = contentView.getRootView().getHeight();
    int keypadHeight = screenHeight - r.bottom;

    return (keypadHeight > screenHeight * 0.15);
}

执行我需要的操作(这里是我调用上述方法的地方):

public static void toggleKeyboard(final Activity activity, final boolean showKeyboard) {
    final InputMethodManager imm =
            (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);

    // The Handler is needed because the method that checks if the keyboard
    // is open need some time to get the updated value from the activity,
    // e.g. when my activity return to foreground. 
    new Handler().postDelayed(new Runnable() {
        public void run() {
            // This 'if' just check if my app still in foreground 
            // when the code is executed to avoid any problem.
            // I've leave out of the answer to keep short, you may use your own.
            if(Tools.isAppInForeground(activity)) {
                // Check the keyboard.
                boolean isVisible = isKeyboardVisible(activity);

                // If I want to show the keyboard and it's not visible, show it!
                if (showKeyboard && !isVisible) {
                    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
                            InputMethodManager.HIDE_IMPLICIT_ONLY);

                // If I want to hide and the keyboard is visible, hide it!
                } else if (!showKeyboard && isVisible) {
                    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
                }
            }
        }
    }, 100);

}

使用时,我只是这样称呼:

toggleKeyboard(myactivity, true); // show
// or
toggleKeyboard(myactivity, false); // hide
那弘
2023-03-14

不幸的是,android并没有本机软件键盘展示活动。

一种处理键盘隐藏的方法是检查输入的符号并按下后退按钮(例如textEdit将收到甚至后退按钮),但这并不是足够灵活的解决方案。

另一种可能的解决方案是:在活动中重写上测量,然后通知观察者(模式观察者)-例如片段。片段应该订阅和退订自己在暂停上恢复事件。类似于活动代码:

private class DialogActivityLayout extends LinearLayout {

        public DialogActivityLayout(Context context, AttributeSet attributeSet) {
            super(context, attributeSet);
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            inflater.inflate(R.layout.activity_dialog, this);
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            final int proposedHeight = MeasureSpec.getSize(heightMeasureSpec);
            final int actualHeight = getHeight();

            /* Layout loaded */
            if (actualHeight == 0 || proposedHeight == actualHeight) {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                return;
            }

            if (proposedHeight > actualHeight) {
                DialogActivity.this.onKeyboardHide();
            } else {
                DialogActivity.this.onKeyboardShow();
            }
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

我不确定,但我记得它只适用于LinearLayout,当然活动应该有调整调整大小标志设置(以编程方式或在宣言中)

另一个(我认为更好的方法)是像这里一样使用全球树观察者

SoftKeyboard打开和关闭监听器在Android中的活动?

 类似资料:
  • 我有一个有碎片的活动。让我们假设一个带有事物列表的列表片段。现在我想让用户添加一个东西,所以我使用FragmentManager将列表片段替换为具有EditText的insert片段。EditText具有焦点并且光标正在闪烁。但软键盘打不开。同样的事情反过来:如果用户输入了新的东西并将其添加到列表中,我将插入片段替换回列表片段。但尽管不再有EditText了,键盘却无法关闭。 对此,正确的实施方式

  • 我的问题是我需要知道键盘隐藏和显示事件,如何找出这一点?

  • 问题内容: 我有一个使用服务几个片段。每个都是具有以下布局的: 开始活动时,将显示软键盘。为了解决这个问题,我在片段中做了以下操作: 我将传入的参数保存为一种访问主要活动的窗口令牌的方式。这可以正常运行,但是不会打扰到in 的键盘。 最初,我尝试使用膨胀布局代替,即: 但这引发了,大概是因为该片段本身不是活动,并且没有唯一的窗口令牌吗? 是否可以从片段中隐藏软键盘,还是应该在中创建一个方法并从片段

  • 我正在开发包含2个片段的应用程序,我想根据需要显示隐藏。下面的代码有一个简单的例子来说明我的问题。这个简单的Fragmentactivity包含一个按钮和一个listfragment。 这个简单的例子完美无瑕。但我不满足于展示隐藏片段。如果删除布局。设置可见性(View.GONE);然后从代码中选择ft.hide(f);不会隐藏碎片。事实上,我们不是在隐藏片段,而是在隐藏容器。 我的问题是,这是一

  • 本文向大家介绍Android Dialog中软键盘的显示与隐藏的示例,包括了Android Dialog中软键盘的显示与隐藏的示例的使用技巧和注意事项,需要的朋友参考一下 1.写在前面 本篇的主要内容是关于在Dialog中软键盘的显示与隐藏问题,需求是在Dialog中有一个密码输入框,弹出Dialog显示软键盘,关闭Dialog隐藏软键盘。 嗯,是不是有点简单,不过在实现的过程中还是遇到了一些问题

  • 问题内容: 首先,我已经看到了该线程。我尝试了那里给出的可接受的方法。 我的应用程序中有两个屏幕。 第一个有2个EditText,一个是用户名,另一个是密码 第二个有一个ListView和一个EditText-过滤listView 在我的第一个屏幕中,我希望用户名EditText专注于启动,并且Keyboard应该可见。这是我的实现(通过删除不必要的/不相关的代码进行简化)。 app_login.