Что не так с темой ICS Holo Dialog? - PullRequest
18 голосов
/ 06 февраля 2012

Я столкнулся с какой-то странной проблемой с действиями, использующими тему Holo Dialog (@android:style/Theme.Holo.Dialog) в Ice Cream Sandwich.

Кажется, что они игнорируют свои макеты и заполняют весь экран вместо ширины и высоты макета из своих макетов XML. Те же макеты работают, что и в Honeycomb, но не в Ice Cream Sandwich.

Пример:

Правильный путь (Соты) enter image description here

Неправильный путь (Ice Cream Sandwich) enter image description here

На обоих устройствах запущена одна и та же версия приложения и используется одна и та же компоновка. Вот этот макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout1"
    android:layout_width="940dp"
    android:layout_height="600dp"
    android:layout_margin="10dp" >

    <GridView
        android:id="@+id/gridView1"
        android:layout_width="940dp"
        android:layout_height="600dp"
        android:horizontalSpacing="10dp"
        android:numColumns="3"
        android:smoothScrollbar="true"
        android:stretchMode="columnWidth"
        android:verticalSpacing="10dp" >
    </GridView>

</LinearLayout>

Есть идеи, как это можно решить? Аналогичная проблема возникает на моем Galaxy Nexus на базе ICS, который полностью игнорирует тег match_parent для высоты и ширины. Тема диалога не работает в ICS?

Обновление:

Я провел еще несколько тестов, и кажется, что ширина 894 dp или меньше даст «правильный» вид, но если я установлю ширину на 895 dp или больше, это будет неправильный вид. Эмулятор работает так же. Это очень странно ...

enter image description here

Ответы [ 4 ]

6 голосов
/ 04 апреля 2012

Я не думаю, что это правда, что ICS препятствует диалогам. Действительно, у них есть целая страница в Android Design . Что действительно верно, так это то, что DialogFragment (что даже предусмотрено в библиотеке поддержки Android ) предпочтительнее, чем устаревшее Dialog .

Я подтверждаю ваши наблюдения о появлении диалогового окна в полноэкранном режиме, но его поведение зависит от устройства. На моем планшете Xoom это происходит при 915dp, а не 895. На моем Galaxy Nexus это происходит при 444dp. А на моей Galaxy Tab 10.1 такого не происходит вообще.

Если вы покопаетесь в источнике, вы увидите, что есть тема Dialog, уменьшенная с Holo для маленьких экранов и с Holo.Dialog.FixedSize для больших экранов. Я ожидал, что это будет основано на размере дисплея, а не на разметке, но, возможно, я ошибусь. Я постараюсь выяснить, что вызывает прыжок.

1 голос
/ 11 февраля 2012

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

0 голосов
/ 19 июня 2013

Попробуйте поменять свой LinearLayout на RelativeLayout. Это сделает свое дело:)

Каким-то образом LinearLayouts всегда заполняет экран при отображении в диалоговом окне. RelativeLayouts нет.

0 голосов
/ 03 мая 2012

Все версии Android игнорируют ширину / высоту тематического макета Dialog xml.

Чтобы это исправить, после звонка:

setContentView(R.layout.contacts_preferences);

добавить строку:

getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

или WRAP_CONTENT для ваших нужд.

...