Что не так с темой ICS Holo Dialog?

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

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

Пример:

Правильный способ (соты) введите здесь описание изображения

Неправильный способ (сэндвич с мороженым) введите здесь описание изображения

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

<?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 или больше, это будет неправильный вид. Эмулятор ведет себя так же. Это крайне странно...

введите здесь описание изображения


person Michell Bak    schedule 06.02.2012    source источник
comment
Это кажется странным. Это выстрел в темноте, но иногда у меня возникают странные графические сбои в моем приложении после изменения цели сборки. Я понятия не имею, почему, но очистка проекта всегда их исправит. Как я уже сказал, снято в темноте, но это может быть так просто.   -  person adneal    schedule 06.02.2012
comment
Спасибо, только что попробовал еще раз, но, похоже, никакого эффекта. Я только что снова обновил свой вопрос - кажется, что это происходит между 894 и 895 dp по ширине.   -  person Michell Bak    schedule 06.02.2012
comment
Ваши снимки экрана сделаны с помощью двух разных устройств? В вашем сообщении предполагается, что это поведение всегда работает правильно на HoneyComb, но не на ICS, но возможно ли, что проблема, с которой вы столкнулись, полностью зависит от размера экрана? Если нет, то вы можете подумать о создании двух AVD (один с 3.0 и другой с 4.0) с точно таким же размером экрана и протестировать его с двумя, чтобы определить, действительно ли проблема зависит от номера версии Android SDK.   -  person Alex Lockwood    schedule 09.05.2012
comment
@AlexLockwood Два разных устройства, но они используют одинаковый размер экрана (xlarge, mdpi). Я также пытался с помощью SDK воссоздать идентичные AVD, и это зависит от версии Android. Как вы можете видеть ниже, Спарки из команды разработчиков Android столкнулся с той же проблемой, и в последнее время этому вопросу уделяется много внимания, поэтому я предполагаю, что многие другие разработчики также замечают эту ошибку.   -  person Michell Bak    schedule 09.05.2012
comment
Вы когда-нибудь догадывались об этом? Я вижу ту же неисправность в ICS, но не в Jellybean, поэтому я полагаю, что они исправили это сейчас. Но мне интересно, есть ли обходной путь для решения этой проблемы в ICS.   -  person Deepak Sarda    schedule 28.03.2013
comment
@antrix Нет, извини. Не нашел решения :-(   -  person Michell Bak    schedule 28.03.2013


Ответы (4)


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

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

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

person Sparky    schedule 04.04.2012
comment
Спасибо, было бы отлично! Даже не знал о теме Holo.Dialog.FixedSize. - person Michell Bak; 04.04.2012
comment
Я вижу ту же проблему: тема активности с использованием темы Theme.Holo.Light.Dialog.NoActionBar ведет себя правильно в JellyBean, но имеет указанную выше проблему «избыточного размера» в ICS. - person Deepak Sarda; 28.03.2013

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

person Michell Bak    schedule 11.02.2012

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

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

setContentView(R.layout.contacts_preferences);

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

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

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

person marmor    schedule 03.05.2012

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

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

person Steffen Vangsgaard    schedule 19.06.2013