web-dev-qa-db-ja.com

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で必要なものを正確に取得していますが、他のデバイスでは、ダイアログの周りに「ボックス」が表示されます。

ダイアログの周りの「ボックス」を削除して、色とマテリアルのテーマを21未満に適用する方法がありますか。できれば、追加の依存関係はありませんか?

API <21のアプリ:

App on API < 21

API> = 21のアプリ:

App on API >= 21

25
snowdragon

新しい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>
33

誰かがまだシンプルで効果的なソリューションを探している場合は、次の行を「alertDialog」スタイルに追加してください:

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

追伸このプロパティを変更すると、API> = 21のPreferenceFragmentのダイアログにも影響するため、異なるスタイルを使用していることを確認してください。API<21の場合は透明なbg、API> = 21の場合は変更なし

10
Alex Timonin

ProgressDialog-以下を試してくださいAndroid 5

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

または

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

すべてのAlertDialogsにAndroid.support.v7.app.AlertDialogを使用すると、新しいAppCompat 22ライブラリでまったく同じ問題が発生しましたが、余分なバックグラウンドレイヤーはProgressDialogsにのみ影響しました。

カスタムテーマを使用してスタイルを設定したときのすべてのAlertDialogは見栄えが良かったのですが、OPで説明されているように、ProgressDialogの背景に奇妙なオーバーレイがありました。

ProgressBarを作成するたびに特定のスタイルを設定するという選択肢がありましたが、アプリケーション全体のソリューションを探していました。

次の2つのリンクを使用して:

プロのようにAlertDialogのスタイルを設定する方法 および Joerg Richterブログ <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>
6
activelogic

リビジョン22.1.0(数日前に更新)をダウンロードして Android.support.v7.app.AlertDialog を使用できます。

2
hoonj