2020年更新
现在这是可能的:
在 Android 11 上,您可以执行以下操作
view.setWindowInsetsAnimationCallback(object : WindowInsetsAnimation.Callback {
override fun onEnd(animation: WindowInsetsAnimation) {
super.onEnd(animation)
val showingKeyboard = view.rootWindowInsets.isVisible(WindowInsets.Type.ime())
// now use the boolean for something
}
})
您还可以聆听显示/隐藏键盘的动画并做相应的过渡。
我推荐阅读Android 11 预览版 https://developer.android.com/preview/features#ime-transitions以及相应的文档 https://developer.android.com/reference/kotlin/android/view/View#setWindowInsetsAnimationCallback(android.view.WindowInsetsAnimation.Callback)
Android 11 之前
然而,这项工作尚未在Compat
版本,所以你需要求助于黑客。
您可以获得窗口插图,如果底部插图大于您认为相当好的某个值(通过实验),您可以认为显示键盘。这不是很好,在某些情况下可能会失败,但没有框架支持。
这是这个问题的一个很好的答案https://stackoverflow.com/a/36259261/372076 https://stackoverflow.com/a/36259261/372076。另外,这里的页面提供了一些不同的方法来实现 Android 11 之前的版本:
https://developer.salesforce.com/docs/atlas.en-us.noversion.service_sdk_android.meta/service_sdk_android/android_detecting_keyboard.htm https://developer.salesforce.com/docs/atlas.en-us.noversion.service_sdk_android.meta/service_sdk_android/android_detecting_keyboard.htm
Note
该解决方案不适用于软键盘和onConfigurationChanged
不会被调用为软(虚拟)
键盘。
您必须自己处理配置更改。
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
Sample:
// from the link above
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 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();
}
}
然后只需更改某些视图的可见性、更新字段并更改布局文件即可。