15

私は簡単なデモを開発しています。このデモでは、単純なカスタム アラート ダイアログを 1 つだけ作成しています。それは正常に動作します。

1.6 でアプリケーションをビルドすると完璧な結果が表示されますが、Android のバージョンを 1.6 から 2.2 に変更すると、予期しない結果が表示されます。カスタム アラート ダイアログを表示する背景画面が表示されません。

これが私のxmlファイルです。 カスタム ダイアログ テーマ ファイル

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CustomDialogTheme" parent="@android:style/AlertDialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowAnimationStyle">@android:style/Theme.Dialog</item>
    </style>
</resources>

これが私のCustomConfirmOkDialogクラスです

package com.utility.org;

import android.app.Activity;
import android.app.Dialog;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

    public class CustomConfirmOkDialog extends Dialog implements OnClickListener
    {
        private Button okButton = null;
        private TextView infoText=null,confirmBody=null;
        private int errorMessage=0;
        @SuppressWarnings("unused")
        private Activity activity;

        public CustomConfirmOkDialog(Activity context,int customdialogtheme,int errorMessage) 
        {
            super(context,customdialogtheme);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.confirm_ok);
            this.errorMessage = errorMessage;
            this.activity = context;
            initControls();
        }

        private void initControls()
        {
            okButton = (Button) findViewById(R.id.ok_button);
            okButton.setOnClickListener(this);

            infoText = (TextView)findViewById(R.id.infoText);
            confirmBody = (TextView)findViewById(R.id.confirmBody);

            switch (this.errorMessage) 
            {

                case Utility.INVALID_USERNAME_PASSWORD:
                    try
                    {
                        infoText.setText(R.string.signIn);
                        confirmBody.setText(R.string.invalidUsernameAndPassword);
                    }
                    catch (Exception e) 
                    {
                        e.printStackTrace();
                    }
                    break;


                default:
                    break;
            }
        }
        public void onClick(View v) 
        {
            dismiss();
        }
    }

以下のコードを使用して、メイン アクティビティからこのクラスを呼び出します。

CustomConfirmOkDialog dialog = new CustomConfirmOkDialog(MainActivity.this, R.style.CustomDialogTheme, Utility.INVALID_USERNAME_PASSWORD);
dialog.show();

ここに画像の説明を入力 ここに画像の説明を入力

1st imageここで、 が背景を示していることがはっきりとわかります。Android 1.6 バージョンでビルドされ2nd imageていますが、背景は表示されません。黒い画面全体が表示されます。アンドロイドバージョン 2.2 でのビルド。誰かがこの問題を解決できるなら、私はとても感謝しています。

この単純でばかげた問題を解決するのを手伝ってくれる人はいますか?

前もって感謝します。

4

3 に答える 3

2

Custom Dialog Theme xml ファイルの次のコードを変更することで、私の問題を解決しました。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CustomDialogTheme" parent="@android:style/Theme.Translucent.NoTitleBar">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
    </style>
</resources>
于 2012-02-11T05:32:21.197 に答える
1

私も同じ問題に直面しました。問題は、Dialogクラスのコンストラクターを呼び出したときです

Dialog(Context context, int themeId)

バックグラウンド アクティビティを非表示にします。私が見つけた唯一の解決策は、このコンストラクターを呼び出さず、代わりに呼び出すだけです

ダイアログ(コンテキストコンテキスト)

レイアウト ファイルでスタイルを設定します。

したがって、コードでは、次のように記述します

スーパー(コンテキスト)

それ以外の

スーパー (コンテキスト、テーマ ID);

于 2011-10-12T08:17:19.160 に答える
0

どうやら、これは既知の問題です。

これは、フレームワーク テーマから継承しようとした場合にのみ発生します。直接使用@android:styleしても、それらは非フルスクリーンとして扱われ、期待どおりに黒い背景が突き抜けます。

1 つの回避策は、ほぼ空白のテーマ (パネルや半透明など) から始めて、独自のレイアウト (ダイアログの端など) で必要なものをレンダリングすることです。

思ったのですが、私はまだこの解決策を自分で完全に理解していません。

実際、彼らがあなたが見たのとまったく同じバグについて話しているかどうかはわかりません。なぜなら、彼らはそれが古いバージョンの SDK (あなたのような新しいバージョンではない) では機能しないと話しているからです。バグレポートを参照してください。

于 2011-10-01T09:36:23.490 に答える