Программная клавиатура перекрывает представления под EditText внутри BottomSheetDialogFragment - PullRequest
0 голосов
/ 04 декабря 2018

У меня просто EditText и Button ниже этого EditText в моем BottomSheetDialogFragment

<ConstraintLayout>
 <EditText/>
 <Button/>
</ConstraintLayout>

И когда открывается мягкая клавиатура, она закрывает все (в моем случае Button) ниже EditText.

Я использую windowSoftInputMode="adjustResize" в своем Activity.

Я много гуглил и уже нашел похожие старые вопросы, но не нашел на них правильного ответа.

программная клавиатура закрывает диалоговое окно нижнего листа

Как настроить размер BottomSheet с помощью Edittext и кнопки под ним?

Это какое-то ошибочное поведение?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Используйте это в onCreate:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE|WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
0 голосов
/ 18 апреля 2019

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

    //...

Надеюсь, это будет полезно.

0 голосов
/ 04 декабря 2018

Окружите свой корневой вид ScrollView, желательно с полосами прокрутки = нет.ScrollView должным образом не изменит ничего в вашей компоновке, кроме как для решения этой проблемы.

И затем установите fitsSystemWindows = "true" в представлении, которое вы хотите сделать полностью показанным над клавиатурой.

...