Что случилось с темой 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]()
Ответы
Ответ 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 нет.