软键盘与BottomSheetDialogFragment内EditText下的视图重叠

时间:2018-12-04 12:45:46

标签: android android-layout bottom-sheet

在我的EditText的{​​{1}}下方,我只有ButtonEditText

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?

这是一种越野车行为吗?

3 个答案:

答案 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);