fun Activity.getRootView(): View {
return findViewById<View>(android.R.id.content)
}
fun Context.convertDpToPx(dp: Float): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dp,
this.resources.displayMetrics
)
}
fun Activity.isKeyboardOpen(): Boolean {
val visibleBounds = Rect()
this.getRootView().getWindowVisibleDisplayFrame(visibleBounds)
val heightDiff = getRootView().height - visibleBounds.height()
val marginOfError = Math.round(this.convertDpToPx(50F))
return heightDiff > marginOfError
}
3 -创建全局布局监听器,用于检测键盘何时可见,如下所示;
val listener = object : ViewTreeObserver.OnGlobalLayoutListener {
// Keep a reference to the last state of the keyboard
private var lastState: Boolean = isKeyboardOpen() ?: false
/**
* Something in the layout has changed
* so check if the keyboard is open or closed
* and if the keyboard state has changed
* save the new state and invoke the callback
*/
override fun onGlobalLayout() {
val isOpen = isKeyboardOpen() ?: false
if (isOpen == lastState) {
return
} else {
onKeyboardStateChanged(isOpen)
lastState = isOpen
}
}
}
6条答案
按热度按时间jdg4fx2g1#
同样的事情也发生在我身上。
我所做的解决方法是,我只是把所有的控件放在ScrollView中。
并设置android:windowSoftInputModeadjustResize。因此,每当键盘打开时,它将滚动屏幕以调整视图,并且Edittext始终显示在屏幕上。
希望这个想法对你有用。
谢谢
wvyml7n52#
这是一个非常古老的帖子,但我最近在我的项目中也遇到了这个问题。我想出了一个完美解决这个问题的解决方案,所以我想分享一下,以帮助人们避免我所经历的挣扎。
将windowSoftInputMode设置为“Adjust Resize”不起作用,因为我的应用程序是全屏的。(这是由于一个android bug提到的here).即使它确实工作了,我相信这个选项不是很好的UI.所以我也想让“调整平移”选项与“更多平移”一起工作,而且不幸的是Android并没有提供调整这个边距的API,而且在editText中添加“paddingBottom”会让屏幕的UI不平衡。
经过大量的研究,我能够通过以下步骤解决这个问题;(我用this非常有用的中等职位)
1 -从AndroidManifest生成windowSoftInputMode=“adjustUnspecified”。
2 -添加以下方法作为扩展函数;
3 -创建全局布局监听器,用于检测键盘何时可见,如下所示;
4 -在onKeyboardStateChanged方法中,我将我的主Activity布局向上滚动screenHeight/4,这通常足够了,但是你可以随意调整滚动量,并将布局更改为你想要滚动的布局。此外,我使用过渡动画来使过渡更平滑,这对于功能来说不是必需的。
5 -在您的onResume上添加要监听的视图,并在onPause上删除监听器,如下所示;
zzzyeukh3#
将您的EditText放入ScrollView中,然后给予属性adjustResize,而不是adjustPan,它会自动调整您的屏幕及其组件。
zqry0prt4#
我在屏幕底部有edittext,当我触摸它打开软键盘,但它隐藏了edittext,所以在布局中进行更改(使用相对布局),它为我工作,而不使用
adjustPan
。hmmo2u0o5#
对于那些实际上想要更多地向上平移页面的人。你可以在你的rootView上做你自己的向上/向下平移逻辑。你需要自己计算要平移多少距离。
参见此示例https://github.com/yatw/SoftKeyboardAdjust
roejwanj6#
您需要将这一行添加到您的Activity中以调整屏幕。