Android:检测软键盘打开

Noa*_*man 25 android scroll view

当软键盘打开时,我想要滚动视图向下滚动到底部.

为此,我可以使用:fullScroll(View.FOCUS_DOWN);

但是,如何在软键盘打开事件触发后触发该命令?

BoD*_*BoD 43

这是我的解决方案:

1 /一个简单的界面

public interface KeyboardVisibilityListener {
    void onKeyboardVisibilityChanged(boolean keyboardVisible);
}
Run Code Online (Sandbox Code Playgroud)

2 /一个实用工具方法(把它放在你想要的地方,例如在一个名为的类中KeyboardUtil)

public static void setKeyboardVisibilityListener(Activity activity, KeyboardVisibilityListener keyboardVisibilityListener) {
    View contentView = activity.findViewById(android.R.id.content);
    contentView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        private int mPreviousHeight;

        @Override
        public void onGlobalLayout() {
            int newHeight = contentView.getHeight();
            if (mPreviousHeight != 0) {
                if (mPreviousHeight > newHeight) {
                    // Height decreased: keyboard was shown
                    keyboardVisibilityListener.onKeyboardVisibilityChanged(true);
                } else if (mPreviousHeight < newHeight) {
                    // Height increased: keyboard was hidden
                    keyboardVisibilityListener.onKeyboardVisibilityChanged(false);
                } else {
                    // No change
                }
            }
            mPreviousHeight = newHeight;
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

3 /以这种方式使用活动(一个好地方在onCreate):

KeyboardUtil.setKeyboardVisibilityListener(this, mKeyboardVisibilityListener);
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢你的建议..它的突出重要的是指出这只适用于adjustResize,不是吗?您可以在此处看到此提案的其他要求吗? (2认同)
  • 失败的'android:inputType ="textPassword"`Neverthless一个整洁的方式! (2认同)

Ric*_*ler 25

根据这篇文章以及关于android-developers的这篇文章,它似乎不可能做你想要的.您可能希望重新检查您的用例以了解您正在做的事情.也许其中一个softInputMode标志对你有用.

  • 在2012年12月.是的,2012年,Android仍无法通知软键盘是否可见.惊人! (51认同)
  • @sebrock 2014年也是如此 (42认同)
  • 2016年临近 (25认同)
  • 是2016年在这里:( (23认同)
  • 差不多2017年.我们有新的模拟器,新的IDE,仍然没有检查键盘状态的解决方案. (19认同)
  • 2020年到来了。这个问题搞了10年!谷歌请不要解决这个问题,我对它有一种情感上的依恋,和我们在一起这么多年了...... (12认同)
  • 2019在这里。第一个人将在不久的将来迈向火星。几周前,全世界已经看到了带有可折叠触摸屏的设备。机器人无处不在。但是我们仍然无法轻松检测Android中的键盘可见性。赫拉! (10认同)
  • 2017年,等待奇迹出现 (9认同)
  • 还是2017年.活着的一年. (8认同)
  • 虽然还是 2020 年,但这一天已经到来,我们现在可以更轻松地检测 Android 11 中是否显示键盘。多么美好的一天啊!https://twitter.com/chrisbanes/status/1230598177511788545 (4认同)
  • 快到 2018 年了,用 Kotlin 和架构组件来摇摆吧,太棒了!还是会很好。. . (3认同)
  • 我的 IOS 开发朋友正在嘲笑我的职业选择。在 2021 年甚至无法判断键盘是否可见的平台上开发应用程序。您可以押注哪个会先出现,是这个功能还是我们远离手指的进化? (3认同)
  • 2018年已经到来,但API无处可寻.我们被迫继续使用可怕的黑客攻击电池和性能.感谢Google开发人员强迫我们使用8年以上的密集黑客攻击,每次轻微的布局更改都会不断触发,而不是提供指示键盘何时打开或关闭的API.`adjust_resize`已经内置了这个,你只需选择不从头开始公开它.然后用户抱怨他们的应用程序正在耗尽电池,如Messenger和其他以键盘为中心的应用程序. (2认同)
  • 已经2021年了,全世界都经历了大流行,但这个小问题仍然存在 (2认同)
  • 2023 年,Covid 几乎已经成为过去式,我们仍然无法以更好的方式检测键盘打开情况。 (2认同)

yer*_*dis 7

看着日期,可能你有一个问题的解决方案,否则:

以下是我对另一个相关问题的回答:有没有办法判断是否显示了软键盘?

但我在这里复制完整的回复以避免死链接:

请检查您的活动的配置更改

这适用于您的AndroidManifest.xml

这适用于您的Activityhttp://developer.android.com/reference/android/app/Activity.html#onConfigurationChanged(android.content.res.Configuration)

您将需要@Override您的Activity的onConfigurationChanged(android.content.res.Configuration)的公共方法,以便能够处理,例如,这个值:
hardKeyboardHidden,
keyboard,
keyboardHidden

对于所有可能的值,请查看http://developer.android.com/reference/android/content/res/Configuration.html

你会看到类似这样的东西:

HARDKEYBOARDHIDDEN_NO   
HARDKEYBOARDHIDDEN_UNDEFINED    
HARDKEYBOARDHIDDEN_YES  
KEYBOARDHIDDEN_NO   
KEYBOARDHIDDEN_UNDEFINED    
KEYBOARDHIDDEN_YES  
KEYBOARD_12KEY  
KEYBOARD_NOKEYS 
KEYBOARD_QWERTY 
KEYBOARD_UNDEFINED
Run Code Online (Sandbox Code Playgroud)

在那里你可以阅读这样的东西:

public int  hardKeyboardHidden  A flag indicating whether the hard keyboard has been      hidden.
public int  keyboard    The kind of keyboard attached to the device.
public int  keyboardHidden  A flag indicating whether any keyboard is available.
Run Code Online (Sandbox Code Playgroud)

更新:

这是我正在谈论的具体样本:

http://developer.android.com/guide/topics/resources/runtime-changes.html

    
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
    // Checks whether a hardware keyboard is available
    if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
        Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
    } else if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES) {
        Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这对你有帮助

  • 这是hardKeyboard的一个示例,这对softKeyboard不起作用 (9认同)