2013-11-25 4 views
10

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

enter image description here

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

Это то, что произойдет с моей компоновкой.

enter image description here

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

+0

можете ли вы разместить свой собственный диалог XML? – TheFlash

+0

@Indiandroid Я отправил код в Pastebin. http://pastebin.com/Mx4rkjaF – MikkoP

+0

вы можете установить ширину диалогового макета программно, вычислив высоту и ширину устройства. – TheFlash

ответ

25

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

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

общественности статической окончательный ИНТ Theme_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's desired minimum size for a dialog's 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's desired minimum size for a dialog's 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

+0

Эй, спасибо за это. Это определенно лучше, чем то, что у меня было, но оно по-прежнему не соответствует моей активности, в которой установлена ​​тема '@android: style/Theme.Holo.Light.Dialog'. Вот несколько фотографий. Диалог внизу - правильный. http://s24.postimg.org/7dzk6dbt1/device_2013_12_01_130746.png http://s18.postimg.org/6hkao2pnd/device_2013_12_01_130722.png Мне также нужно применить мою специальную тему к диалогу (чтобы изменить цвета прядильщиков, поисковых барабанов и т. д.), так что это немного плохо, не так ли? У меня не может быть нескольких тем. Могу ли я каким-то образом реализовать это в своей теме? – MikkoP

+0

@MikkoP У меня есть несколько вопросов о выходе, который вы ищете. Давайте продолжим этот обмен в чате (http://chat.stackoverflow.com/rooms/42277/custom-dialog-size-to-match-theme-holo-light-dialog). – Vikram

+0

Эй, как мы обсуждали, мне нужно применить специальную тему для моего диалога. Не только макет, но и тема для поисковых систем и роликов в моих макетах. У меня есть эта сборка с генератором тем (http://android-holo-colors.com/). Вы знаете, как я могу применить эту тему, если я использую 'Theme.Holo.Light.Dialog.MinWidth'? – MikkoP

0

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

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

Что вы подразумеваете под 'set it's scale scale правильно'. И куда идут эти две строки кода? – MikkoP

+0

В стиле.xml положите это. <имя стиля = "CustomDialogTheme" родитель = "@ андроида: стиль/Theme.Dialog"> <имя элемента = "андроид: windowBackground"> ​​@ цвет/overlay_background<имя элемента = "андроид: windowIsFloating"> ложь <имя элемента = "андроид: windowNoTitle"> истинный и установить диалог стиль CustomDialogTheme и шириной до match_parent. –

+0

Это заполнит весь экран. Если я установил 'windowIsFloating' в значение true, он рухнет, чтобы соответствовать первому TextView в макете. – MikkoP

0

Два сценария

а. Если вам это нужно, чтобы заполнить экран полностью установить ваши родители 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.

0

Вы можете попытаться изменить Dialog измерение во время выполнения, например:

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

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

+0

Я могу изменить его в коде, но это не означает, что ширина также будет соответствовать исходной ширине диалога. – MikkoP

3

Просто добавьте два значения для вашей темы.

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

E.g.

<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> 
Смежные вопросы