Смущает поведение высоты AlertDialog

У меня есть простой AlertDialog, показанный так:

new AlertDialog.Builder(this)
    .setTitle("Test")
    .setView(R.layout.dialog_test)
    .setPositiveButton("button1", null)
    .show();

Вот так выглядит раскладка dialog_test:

<?xml version = "1.0" encoding = "utf-8"?>
<TextView
    xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "match_parent"
    android:layout_height = "wrap_content"
    android:background = "#FF0000"
    android:text = "Test"/>

TextView отображается вверху области содержимого диалогового окна с дополнительным пространством под ним. Похоже, что для AlertDialog определена какая-то минимальная высота. Я хотел бы избавиться от минимальной высоты AlertDialog и обернуть высоту TextView, или я хотел бы хотя бы вертикально центрировать TextView в пространстве содержимого AlertDialog.

Я попытался настроить макет диалогового окна таким образом, чтобы высота отображалась до и после его показа, но он ничего не делает: dialog.window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)

Я также попытался установить android:layout_height TextView на wrap_content и android:layout_gravity на center_vertical, но TextView по-прежнему остается в верхней части пространства содержимого AlertDialog. Я попытался установить android:layout_height TextView на match_parent и android:gravity на center_vertical, но высота TextView не заполняет пространство содержимого AlertDialog и, похоже, остается обернутой и остается в верхней части содержимого AlertDialog.

Я использую android.support.v7.app.AlertDialog, но также пробовал android.app.AlertDialog, и у него такая же проблема.

Итак, есть ли способ удалить минимальную высоту AlertDialog или хотя бы центрировать содержимое по вертикали, когда высота моего содержимого меньше минимальной высоты AlertDialog?

Спасибо!

ОБНОВИТЬ: просмотрев код AlertDialog, я обнаружил, что макет (customPanel), в который добавлено ваше пользовательское представление, действительно имеет минимальную высоту.

А убрать минимальную высоту можно так:

AlertDialog dialog = new AlertDialog.Builder(this)
    .setView(R.layout.dialog_test)
    .show();
dialog.findViewById(R.id.customPanel).setMinimumHeight(0);
// Use R.id.contentPanel if you're using setMessage() instead of setView()

Или, если вы хотите сохранить минимальную высоту, но хотите центрировать контент по вертикали, я сделал это так:

AlertDialog dialog = new AlertDialog.Builder(this)
    .setView(R.layout.dialog_test)
    .show();
((FrameLayaout.LayoutParams) dialog.findViewById(R.id.custom).getLayoutParams()).gravity = Gravity.CENTER_VERTICAL

использовать inflater для надувания макета? я думаю, в этом проблема

Na-In Hae 16.05.2018 22:58

я предполагаю, что диалоговое окно предупреждения создает пространство для кнопок, которые он обычно содержит.

Barns 16.05.2018 23:05

Использование LayoutInflater ничего не дало. Если я не определяю никаких кнопок или даже заголовка, под TextView все равно остается много ненужного места.

Altherat 16.05.2018 23:11

Я имел в виду, что диалоговое окно предупреждения может создавать пространство для кнопок, даже если они не определены. Вроде как разница между View.INVISIBLE и View.GONE

Barns 16.05.2018 23:17

Я не думаю, что это так. Я думаю, что для содержимого AlertDialog указана минимальная высота. Если я создам AlertDialog и просто установлю текст с помощью setMessage, под сообщением останется много ненужного места, если сообщение короткое. Но если я поставлю длинное сообщение, лишнего места не останется.

Altherat 16.05.2018 23:25

Обычно, если мне просто нужно проинформировать своего пользователя о «чем угодно» и мне нужен определенный «вид», я создаю собственный макет для сообщения Toast. Конечно, недостатком является то, что он исчезает сам по себе.

Barns 16.05.2018 23:28

У меня есть настраиваемое диалоговое окно предупреждений с полосой для большого пальца (SeekBar) и кнопкой, я использовал перенос содержимого для всех. работает нормально. Конечно, есть место для заголовка и положительной кнопки, но если я уберу их, то место, которое они занимают, исчезнет.

Na-In Hae 16.05.2018 23:42

Но достаточно ли большой у вас SeekBar по высоте? Я все еще думаю, что для содержимого AlertDialog есть минимальная высота. Я создал совершенно новый проект, и он все еще показывает ненужное место для самого простого AlertDialog: AlertDialog.Builder(this).setView(R.layout.dialog_test).show‌​(). Изображение здесь: i.imgur.com/4YF6l3d.png

Altherat 17.05.2018 00:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
62
0

Другие вопросы по теме