Диалог не заполняет все окно на некоторых устройствах - PullRequest
0 голосов
/ 12 февраля 2019

Пока я возился с приложением Google I / O 2018 для Android , я заметил, что на моем устройстве (Xiaomi Mi5, Android 7.0) их диалоговые окна затемняют весь экран, кроме ()белая ) строка состояния, как показано на скриншоте:

screen1

Не встречается на эмуляторах (протестировано на 6.0, 7.0, 8.0).

Я взглянул на иерархию представлений и заметил, что у дочерних элементов DecorView его верхнее заполнение установлено равным 60, в то время как в эмуляторах оно было установлено равным 0.

screen2 - границы этого FrameLayout

Вот их реализация Диалога: https://github.com/google/iosched/blob/master/mobile/src/main/java/com/google/samples/apps/iosched/widget/CustomDimDialog.kt

class CustomDimDialog(context: Context?) : AppCompatDialog(context, R.style.Theme_IOSched_Dialog) {

init {
    supportRequestWindowFeature(Window.FEATURE_NO_TITLE)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    window?.run {
        // Spread the dialog as large as the screen.
        clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
    }
}

override fun setContentView(view: View?) {
    if (view != null) {
        super.setContentView(wrap(view))
    }
}

private fun wrap(content: View): View {
    val res = context.resources
    val verticalMargin = res.getDimensionPixelSize(R.dimen.dialog_vertical_margin)
    val horizontalMargin = res.getDimensionPixelSize(R.dimen.dialog_horizontal_margin)
    return FrameLayout(context).apply {
        addView(content, FrameLayout.LayoutParams(
            FrameLayout.LayoutParams.WRAP_CONTENT,
            FrameLayout.LayoutParams.WRAP_CONTENT
        ).apply {
            setMargins(horizontalMargin, verticalMargin, horizontalMargin, verticalMargin)
            gravity = Gravity.CENTER
        })
        val rect = Rect()
        setOnTouchListener { _, event ->
            when (event.action) {
            // The FrameLayout is technically inside the dialog, but we treat it as outside.
                MotionEvent.ACTION_DOWN -> {
                    content.getGlobalVisibleRect(rect)
                    if (!rect.contains(event.x.toInt(), event.y.toInt())) {
                        cancel()
                        true
                    } else {
                        false
                    }
                }
                else -> {
                    false
                }
            }
        }
        background = ColorDrawable(ResourcesCompat.getColor(res, R.color.scrim, context.theme))
    }
}

Кто-нибудь знает, как это исправить?

1 Ответ

0 голосов
/ 12 февраля 2019

попробуйте, это будет работать для вас

    WindowManager manager = (WindowManager) 
    getActivity().getSystemService(Activity.WINDOW_SERVICE);
    int width;
    width = manager.getDefaultDisplay().getWidth();
    pauseDialog.getWindow().setBackgroundDrawable(null);
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.copyFrom(pauseDialog.getWindow().getAttributes());
    lp.width = width;
    lp.gravity = Gravity.CENTER;
    pauseDialog.getWindow().setAttributes(lp);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...