Я нашел решение для того же случая.Вы можете просто увеличить отступ, когда будет показана программная клавиатура.Это решение доступно для 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)
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()
}
//...
Надеюсь, это будет полезно.