web-dev-qa-db-ja.com

Androidダイアログテーマによりアイコンが薄すぎます

Jelly Beanを対象としたEclipseで新しいアプリケーションを作成しました。これはすべて自動的に作成されたコードです。マニフェストはアプリケーションテーマをAppNameに設定します。

<application
    Android:allowBackup="true"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >
    . . . 

これは、値dirのスタイルのAppBaseThemeに変換されます。

<resources xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <!--
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    -->
    <style name="AppBaseTheme" parent="Android:Theme.Light">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>

</resources>

そして、values-v14/styles.xmlは次のとおりです。

<resources>

    <!--
        Base application theme for API 14+. This theme completely replaces
        AppBaseTheme from BOTH res/values/styles.xml and
        res/values-v11/styles.xml on API 14+ devices.
    -->
    <style name="AppBaseTheme" parent="Android:Theme.Holo.Light.DarkActionBar">
        <!-- API 14 theme customizations can go here. -->
    </style>

</resources>

次に、終了する前に確認ダイアログボックスを作成しました。

    case R.id.menu_quit:
        new AlertDialog.Builder(this)
        .setIcon(Android.R.drawable.ic_dialog_alert)
        .setTitle(R.string.confirm_title)
        .setMessage(R.string.confirm_text)
        .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();    
            }

結果のダイアログボックスは次のとおりです。

resulting dialog box

なぜic_dialog_iconはとても軽いのですか?かろうじて見えます。私はすべてデフォルトを使用していますが、テーマや色は変更していません。背景とのコントラストがより強いアイコンをシステムが選択すべきではありませんか?どうすれば修正できますか?

修正して編集
以下のトミック情報Android.R.attr.alertDialogIconのドキュメントを読み、この修正を行いました(setIcon()setIconAttribute( )

        new AlertDialog.Builder(this)
        .setIconAttribute(Android.R.attr.alertDialogIcon)
        .setTitle(R.string.confirm_title)
        .setMessage(R.string.confirm_text)
        .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {

ダイアログは次のようになります。

enter image description here

46
ilomambo

問題は、プライベートリソースAndroid.R.drawable.ic_dialog_alertを使用していることです。

プライベートリソースの使用には問題があり、デバイスごとに異なる可能性があり、すべてのデバイスに存在するかどうかさえ確認できません。最善の方法は、プライベートリソースの使用を避けることです。それらが必要な場合は、Androidソースからコピーして、プロジェクトのリソースに配置する必要があります。

リソースが白すぎる理由は、標準(Holo以外)のテーマに使用されているリソース(Android.R.drawable.ic_dialog_alert)を使用しているためです。
しかし、Android 4.x(APIレベル14)を実行しているデバイスでは、通常別のリソースを使用しているHoloテーマ(Android:Theme.Holo.Light.DarkActionBar)を使用しています。

Holoテーマのデフォルトのアラートアイコンは、ダークテーマの場合はAndroid.R.id.ic_dialog_alert_holo_dark、ライトテーマの場合はAndroid.R.id.ic_dialog_alert_holo_lightです(この場合、代わりにこのリソースを使用する必要があります)。

注:APIレベル11以降、現在のテーマのデフォルトのアラートダイアログアイコンを参照する属性Android.R.attr.alertDialogIconがあります。コードでは次のように使用できます。

case R.id.menu_quit:
    new AlertDialog.Builder(this)
    .setIconAttribute(Android.R.attr.alertDialogIcon)
    .setTitle(R.string.confirm_title)
    .setMessage(R.string.confirm_text)
    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            finish();    
        }

それでも、Androidソースからプロジェクトのリソースにリソースをコピーすることをお勧めします。これが、アイコンが常に同じに見えることを確認できる唯一の方法だからです。

50
Tomik

これらのデバイスでもライトテーマを使用している場合は、プレHCの Tomikの回答 に基づく回避策:

AlertDialog.Builder builder = ...;
if (VERSION.SDK_INT < VERSION_CODES.HONEYCOMB) {
    Drawable icon = ContextCompat.getDrawable(context, Android.R.drawable.ic_dialog_alert).mutate();
    icon.setColorFilter(new ColorMatrixColorFilter(new float[] {
            -1, 0, 0, 0, 255, // red = 255 - red
            0, -1, 0, 0, 255, // green = 255 - green
            0, 0, -1, 0, 255, // blue = 255 - blue
            0, 0, 0, 1, 0     // alpha = alpha
    }));
    builder.setIcon(icon);
} else {
    builder.setIconAttribute(Android.R.attr.alertDialogIcon);
}
2
TWiStErRob