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()
    }

    //...