在我的EditText
的{{1}}下方,我只有Button
和EditText
BottomSheetDialogFragment
打开软键盘时,它会覆盖<ConstraintLayout>
<EditText/>
<Button/>
</ConstraintLayout>
下的所有内容(在我的情况下为Button
)。
我在EditText
中使用windowSoftInputMode="adjustResize"
。
我在Google上搜索了很多,已经找到了类似的旧问题,但是没有正确的答案。
soft keyboard is covering bottom sheet dialog
How to adjust size of BottomSheet with Edittext and button below it?
这是一种越野车行为吗?
答案 0 :(得分:1)
我找到了相同情况的解决方案。您将仅在显示软键盘时增加填充。此解决方案可用于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)
}
}
}
在enable()
呼叫onStart()
,然后在disable()
呼叫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)
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()
}
//...
希望它会有用。
答案 1 :(得分:0)
使用ScrollView环绕您的根视图,最好使用scrollbars = none。 ScrollView不会正确改变布局,除非用于解决此问题。
然后在要使其完全显示在键盘上方的视图上设置fitsSystemWindows =“ true”。
答案 2 :(得分:0)
在onCreate
中使用它:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);