Подтвердить что ты не робот

Что случилось с темой ICS Holo Dialog?

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

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

Пример:

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

Неправильный способ (сэндвич с мороженым) 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?

Update:

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

enter image description here

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

setContentView(R.layout.contacts_preferences);

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

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

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

Ответ 4

Попробуйте заменить LinearLayout на RelativeLayout. Это сделает трюк:)

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