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

Диалоговое обрезание с помощью AppCompat-v7 22 приводит к уродливым теням на api <21

Я использую AppCompat для написания приложения, оформленного в стиле материала. Поскольку AppCompat не влияет на диалоги, я скрываю диалоги как таковые:

styles.xml:

<style name="AppTheme.Base" parent="Theme.AppCompat">
    <!-- Set AppCompat’s color theming attrs -->
    <item name="colorPrimary">@color/green</item>
    <item name="colorPrimaryDark">@color/green_darker</item>
    <item name="colorAccent">@color/accent</item>

    <item name="android:alertDialogTheme">@style/alertDialog</item>
    <item name="android:dialogTheme">@style/alertDialog</item>
</style>

<style name="alertDialog" parent="Theme.AppCompat.Dialog">
    <item name="colorPrimary">@color/green</item>
    <item name="colorPrimaryDark">@color/green_darker</item>
    <item name="colorAccent">@color/accent</item>
</style>

Я получаю именно то, что хотел на android api >= 21, но на других устройствах я получаю "окно" вокруг диалогов.

Есть ли способ избавиться от "окна" вокруг диалогового окна и даже получить цветовую и материальную тему, примененную к api < 21, предпочтительно без каких-либо дополнительных описаний?

App на Api < 21:

App on API < 21

App on API >= 21:

App on API >= 21

4b9b3361

Ответ 1

С помощью нового AppCompat v22.1 вы можете использовать новый android.support.v7.app.AlertDialog или новый AppCompatDialog

Просто используйте такой код (конечно, в вашем случае вам нужно использовать собственный макет, чтобы иметь индикатор выполнения)

import android.support.v7.app.AlertDialog

AlertDialog.Builder builder =
       new AlertDialog.Builder(this, R.style.AppCompatAlertDialogStyle);
            builder.setTitle("Dialog");
            builder.setMessage("Lorem ipsum dolor ....");
            builder.setPositiveButton("OK", null);
            builder.setNegativeButton("Cancel", null);
            builder.show();

И используйте такой стиль:

<style name="AppCompatAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="colorAccent">#FFCC00</item>
        <item name="android:textColorPrimary">#FFFFFF</item>
        <item name="android:background">#5fa3d0</item>
    </style>

Ответ 2

Если кто-то все еще ищет простое и эффективное решение, просто добавьте эту строку в свой стиль alertDialog:

<item name="android:windowBackground">@android:color/transparent</item>

P.S. изменение этого свойства также влияет на диалоги PreferenceFragment на API >= 21, поэтому убедитесь, что вы используете разные стили: с прозрачным bg для API < 21 и без каких-либо изменений для API >= 21

Ответ 3

У меня была такая же проблема с новой библиотекой AppCompat 22 при использовании android.support.v7.app.AlertDialog для всех моих AlertDialogs, но дополнительные фоновые слои только повлияли на ProgressDialogs.

Все мои AlertDialogs при стилизации с использованием моей пользовательской темы выглядели великолепно, но у ProgressDialog было странное наложение на фоне, как описано в OP.

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

С помощью этих двух ссылок:

Как создать AlertDialogs, как Pro и Блог Йорга Рихтера Я смог избавиться от дополнительный слой, нарисованный на < 21 ProgressDialogs.

Я обнаружил, что во всех версиях ProgressBar рисует свой фон на основе того, что определено по умолчанию в "android: alertDialogStyle".

Итак, чтобы избавиться от дополнительного слоя, мне пришлось определить мои собственные стили и установить их для "android: alertDialogStyle". При этом я также переопределяю макеты по умолчанию, применяемые к ProgressDialogs.

Здесь мои themes.xml:

<item name="android:alertDialogTheme">@style/MyAlertDialogTheme</item>
<item name="alertDialogTheme">@style/MyAlertDialogTheme</item>
<item name="android:alertDialogStyle">@style/MyAlertDialogStyles</item>

И мои styles.xml:

<style name="MyAlertDialogTheme">
    <item name="android:windowIsFloating">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
    <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
    <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
    <item name="android:background">@color/theme_alert_dialog_background</item>
    <item name="colorAccent">@color/theme_accent_1</item>
</style>

<style name="AlertDialog">
    <item name="android:fullDark">@android:color/transparent</item>
    <item name="android:topDark">@android:color/transparent</item>
    <item name="android:centerDark">@android:color/transparent</item>
    <item name="android:bottomDark">@android:color/transparent</item>
    <item name="android:fullBright">@android:color/transparent</item>
    <item name="android:topBright">@android:color/transparent</item>
    <item name="android:centerBright">@android:color/transparent</item>
    <item name="android:bottomBright">@android:color/transparent</item>
    <item name="android:bottomMedium">@android:color/transparent</item>
    <item name="android:centerMedium">@android:color/transparent</item>
</style>

Ответ 4

ProgressDialog - попробуйте ниже android 5

dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

или

dialog.getWindow().clearFlags(LayoutParams.FLAG_DIM_BEHIND);

Ответ 5

Вы можете скачать версию 22.1.0 (обновлено несколько дней назад) и использовать android.support.v7.app.AlertDialog