Размер пользовательского диалога для соответствия Theme.Holo.Light.Dialog

Если у меня есть Activity, для которого задана тема Theme.Holo.Light.Dialog, она будет масштабироваться. Он полностью заполняет экран на телефонах в портретном режиме, но в ландшафтном режиме он не будет растягиваться неоправданно долго. Например, на этом снимке из Google вы можете видеть, что диалог не заполняет весь экран.

enter image description here

Он не будет либо крах, чтобы соответствовать ширине заголовка, как то, что произойдет, если у вас есть собственный сборник Dialog с помощью класса, который расширяет класс Dialog.

Вот что будет с моим макетом.

enter image description here

Какие свойства мне нужно применить к LinearLayout, чтобы сделать его масштабным?

Ответ 1

Вы можете использовать Theme.Holo.Light.Dialog.MinWidth для правильной настройки макета.

Из документации:

public static final int Тема_Holo_Light_Dialog_MinWidth

Вариант Theme.Holo.Light.Dialog, который имеет хорошую минимальную ширину для регулярный диалог.

Способ использования этого заключается в передаче ContextThemeWrapper вместо контекста (с использованием этого) в ваш пользовательский конструктор диалога:

YourCustomDialog cDialog = new YourCustomDialog(
                        new ContextThemeWrapper(this, 
                              android.R.style.Theme_Holo_Light_Dialog_MinWidth));

Вот как определяется Theme.Holo.Light.Dialog.MinWidth:

<style name="Theme.Holo.Light.Dialog.MinWidth">
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>

От dimens.xml:

@android: DIMEN/dialog_min_width_major:

<!-- The platform desired minimum size for a dialog width when it
     is along the major axis (that is the screen is landscape).  This may
     be either a fraction or a dimension. -->
<item type="dimen" name="dialog_min_width_major">65%</item>

@android: DIMEN/dialog_min_width_minor:

<!-- The platform desired minimum size for a dialog width when it
     is along the minor axis (that is the screen is portrait).  This may
     be either a fraction or a dimension. -->
<item type="dimen" name="dialog_min_width_minor">95%</item>

Как кажется, ширина диалога на картинке, которую вы опубликовали, составляет около 65%. В портретном режиме это будет 95%.

Честно говоря, ширина не выглядит как 95% в портретном режиме, но она лучше, чем раньше:):

enter image description here

Ответ 2

Просто добавьте два значения в настраиваемую тему.

<item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
<item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>

например.

<style name="MyDialog" parent="ThDialogBase">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@color/transparent</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
        <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
</style>

Ответ 3

В моем настраиваемом диалоговом окне я использую следующие свойства и устанавливаю ширину диалогового окна для соответствия родительской и масштабной шкале.

 <item name="android:windowBackground">@null</item>
 <item name="android:windowIsFloating">false</item>

Ответ 4

Два сценария

а. Если вам нужно, чтобы заполнить экран, полностью установите родителей minWidth и minHeight на 1000dp

LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:minWidth="1000dp"  
    android:minHeight="1000dp"

б. Если вам нужно его масштабировать, не заполняя весь экран. Установите один из дочерних элементов вашего LinearLayout в пределах RelativeLayout и установите relative layouts width to match_parent.

Ответ 5

Можете ли вы попробовать изменить размер диалогового окна во время выполнения, например:

DisplayMetrics metrics = getResources().getDisplayMetrics();
int width = metrics.widthPixels;
yourDialog.show();
yourDialog.getWindow().setLayout((6 * width)/7, LayoutParams.WRAP_CONTENT);

или

Dialog yourDialog = dialogFragment.getDialog();
yourDialog.getWindow().setLayout((6 * width)/7, (4 * height)/5);

если вы используете фрагменты.