Android 软键盘与BottomSheetDialogFragment内的EditText下的视图重叠
在我的Android 软键盘与BottomSheetDialogFragment内的EditText下的视图重叠,android,android-layout,bottom-sheet,Android,Android Layout,Bottom Sheet,在我的BottomSheetDialogFragment <ConstraintLayout> <EditText/> <Button/> </ConstraintLayout> 当软键盘打开时,它会覆盖EditText下面的所有内容(在我的例子中是按钮) 我正在我的活动中使用windowSoftInputMode=“adjustResize” 我在谷歌上搜索了很多,已经找到了类似的老问题,但没有正确的答案 这是一种错误行为吗?用Sc
BottomSheetDialogFragment
<ConstraintLayout>
<EditText/>
<Button/>
</ConstraintLayout>
当软键盘打开时,它会覆盖EditText
下面的所有内容(在我的例子中是按钮
)
我正在我的活动中使用windowSoftInputMode=“adjustResize”
我在谷歌上搜索了很多,已经找到了类似的老问题,但没有正确的答案
这是一种错误行为吗?用ScrollView围绕根视图,最好使用scrollbars=none。ScrollView不会正确地更改布局中的任何内容,除非用于解决此问题
然后在要使其完全显示在键盘上方的视图上设置fitsystemwindows=“true”。在创建时使用此选项:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
我为同一个案子找到了解决办法。当显示软键盘时,您可以增加填充。此解决方案适用于API 19+
import android.graphics.Rect
import android.os.Build
import android.view.View
import android.view.ViewTreeObserver
import androidx.core.view.updatePaddingRelative
class UnderKeyboardViewElevator(private val decorView: View, private val contentView: View) {
private var initialPaddingBottom: Int = contentView.paddingBottom
private var onGlobalLayoutListener = ViewTreeObserver.OnGlobalLayoutListener {
val r = Rect()
decorView.getWindowVisibleDisplayFrame(r)
val height = decorView.context.resources.displayMetrics.heightPixels
val diff = height - r.bottom
if (diff != 0) {
val targetPadding = diff + initialPaddingBottom
if (contentView.paddingBottom != targetPadding) {
contentView.updatePaddingRelative(bottom = targetPadding)
}
} else {
if (contentView.paddingBottom != initialPaddingBottom) {
contentView.updatePaddingRelative(bottom = initialPaddingBottom)
}
}
}
init {
if (Build.VERSION.SDK_INT >= 19) {
decorView.viewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener)
}
}
fun enable() {
if (Build.VERSION.SDK_INT >= 19) {
decorView.viewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener)
}
}
fun disable() {
if (Build.VERSION.SDK_INT >= 19) {
decorView.viewTreeObserver.removeOnGlobalLayoutListener(onGlobalLayoutListener)
}
}
}
在onStart()调用enable()
,在onStop()调用disable()
:
希望它会有用。
它不工作,它会立即显示键盘,但没有帮助。我已经使用了adjustResize
private var elevator: UnderKeyboardViewElevator? = null
//...
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = BottomSheetDialog(context!!)
val dialogRoot = View.inflate(context, R.layout.my_layout, null)
dialog.setContentView(dialogRoot)
val decorView = activity!!.window!!.decorView
elevator = UnderKeyboardViewElevator(decorView, dialogRoot)
return dialog
}
override fun onStart() {
elevator?.enable()
super.onStart()
}
override fun onStop() {
super.onStop()
elevator?.disable()
}
//...