Android: Theme.Dialog layout - динамически видимый контент обрезается - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть «диалоговое» действие, основанное на встроенной теме Android Theme.Dialog:

<style name="Theme.Dialog">
    <item name="android:windowFrame">@null</item>
    <item name="android:windowTitleStyle">@android:style/DialogWindowTitle</item>
    <item name="android:windowBackground">@android:drawable/panel_background</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>        

    <item name="android:colorBackgroundCacheHint">@null</item>

    <item name="textAppearance">@android:style/TextAppearance</item>
    <item name="textAppearanceInverse">@android:style/TextAppearance.Inverse</item>

    <item name="textColorPrimary">@android:color/primary_text_dark</item>
    <item name="textColorSecondary">@android:color/secondary_text_dark</item>
    <item name="textColorTertiary">@android:color/tertiary_text_dark</item>
    <item name="textColorPrimaryInverse">@android:color/primary_text_light</item>
    <item name="textColorSecondaryInverse">@android:color/secondary_text_light</item>
    <item name="textColorTertiaryInverse">@android:color/tertiary_text_light</item>
    <item name="textColorPrimaryDisableOnly">@android:color/primary_text_dark_disable_only</item>
    <item name="textColorPrimaryInverseDisableOnly">@android:color/primary_text_light_disable_only</item>
    <item name="textColorPrimaryNoDisable">@android:color/primary_text_dark_nodisable</item>
    <item name="textColorSecondaryNoDisable">@android:color/secondary_text_dark_nodisable</item>
    <item name="textColorPrimaryInverseNoDisable">@android:color/primary_text_light_nodisable</item>
    <item name="textColorSecondaryInverseNoDisable">@android:color/secondary_text_light_nodisable</item>
    <item name="textColorHint">@android:color/hint_foreground_dark</item>
    <item name="textColorHintInverse">@android:color/hint_foreground_light</item>
    <item name="textColorSearchUrl">@android:color/search_url_text</item>

    <item name="textAppearanceLarge">@android:style/TextAppearance.Large</item>
    <item name="textAppearanceMedium">@android:style/TextAppearance.Medium</item>
    <item name="textAppearanceSmall">@android:style/TextAppearance.Small</item>
    <item name="textAppearanceLargeInverse">@android:style/TextAppearance.Large.Inverse</item>
    <item name="textAppearanceMediumInverse">@android:style/TextAppearance.Medium.Inverse</item>
    <item name="textAppearanceSmallInverse">@android:style/TextAppearance.Small.Inverse</item>
</style>

Мой макет для действия, у меня есть один EditText, одна кнопка и невидимый TextViewЯ использую для отображения сообщений пользователю на основе достоверности содержимого EditText:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/dialog" 
android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingLeft="6dp"
    android:paddingRight="6dp"
    android:paddingBottom="6dp">
    <TextView 
        style="@style/DialogMessage"
        android:id="@+id/error" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dp"
        android:visiblity="gone" />
    <EditText 
        android:id="@+id/title" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="text|textCapWords"
        android:maxLength="100"
        android:maxLines="1"
        android:ems="20"
        android:scrollHorizontally="true" />
    <Button 
        android:id="@+id/rename"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="right" />    
</LinearLayout>

Когда пользователь находится в портретном режиме, и они вводят некоторый «плохой» текст в EditText, я делаю TextViewвидимый, и заполните его соответствующим сообщением об ошибке.Это прекрасно работает, так как все смещается вниз, и TextView отображается великолепно, даже если содержимое занимает несколько строк.Теперь в альбомной ориентации, когда я делаю то же самое, TextView отображается нормально, но нижний элемент (в данном случае кнопка) сжимается примерно до половины его нормальной высоты.Перемещение элементов по кругу, если я поместил EditText внизу, когда TextView становится видимым, он тоже сжимается, а нанесение TextView внизу приводит к чему-то большему, чем отрезание одной строки текста.

Я попытался форсировать проблему после заполнения TextView, заново установив размеры LinearLayout с помощью:

LinearLayout dialog = (LinearLayout) findViewById(R.id.dialog);
dialog.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

И я попытался повторно нарисовать LinearLayout после заполнения TextView, вызвав:

LinearLayout dialog = (LinearLayout) findViewById(R.id.dialog);
dialog.invalidate();

Ни сработало.Любые идеи, что здесь происходит?

Спасибо,

Пол

Редактировать:

Существует достаточно экрана, чтобы показать все три компонента полностью... как полностью раздутый TextView с тем же содержимым, что и у меня, и все отображается полностью.

1 Ответ

8 голосов
/ 06 апреля 2011

Не понял, почему это происходит, но нашел обходной путь.Переключение макета на RelativeLayout решило проблему, и теперь все отображается правильно, используя следующее:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/dialog" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:paddingBottom="6dp">
<EditText 
    android:id="@+id/inpt_title" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="text|textCapWords"
    android:maxLength="100"
    android:maxLines="1"
    android:ems="20"
    android:scrollHorizontally="true" />
<Button 
    android:id="@+id/btn_rename"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignRight="@id/inpt_title"
    android:layout_below="@id/inpt_title" />  
<TextView 
    style="@style/DialogMessage"
    android:id="@+id/error" 
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_below="@id/btn_rename"
    android:layout_alignLeft="@id/inpt_title"
    android:layout_alignRight="@id/inpt_title" />  
</RelativeLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...