我在EditText
的Button
下面只有EditText
和BottomSheetDialogFragment
<ConstraintLayout>
<EditText/>
<Button/>
</ConstraintLayout>
当软键盘打开时,它覆盖了qazxsw poi下面的所有东西(在我的情况下是qazxsw poi)。
我在我的Button
中使用EditText
。
我已经google了很多,已经找到了类似的旧问题,但没有正确答案。
windowSoftInputMode="adjustResize"
Activity
这是某种有缺陷的行为吗?
我找到了相同案例的解决方案。您可以在显示软键盘时增加填充。该解决方案适用于API 19+。
soft keyboard is covering bottom sheet dialog
在How to adjust size of BottomSheet with Edittext and button below it?打电话给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)
}
}
}
,在enable()
打电话给onStart()
:
disable()
希望它会有用。
使用ScrollView环绕根视图,最好使用scrollbars = none。除了用于解决此问题之外,ScrollView将不会对您的布局进行任何更改。
然后在要在键盘上方完全显示的视图上设置fitsSystemWindows =“true”。
在onStop()
中使用它:
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()
}
//...