3

アーカイブしようとしているもの: カスタム ビューを含むダイアログが必要ですが、標準のアイコン、タイトル、ボタンがAlertDialog.

私がやっているのは、このカスタムダイアログクラスです:

public class CustomDialog extends AlertDialog.Builder {

    private Activity activity;
    private View root;

    public CustomDialog(Activity context) {
        super(context);
        this.activity = context;
    }

    public void setView(int layoutResID) {
        LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        root = inflater.inflate(layoutResID, (ViewGroup) activity.findViewById(R.id.dialog_root), false);
        ScrollView scroller = new ScrollView(activity);
        scroller.addView(root);
        setView(scroller);
    }

    public void setCustomView(View v) {
        ScrollView scroller = new ScrollView(activity);
        scroller.addView(v);
        setView(scroller);
    }

    public View getRoot() {
        return root;
    }

    @Override
    public AlertDialog create() {
        AlertDialog dialog = super.create();

        dialog.getWindow().getAttributes().width = LayoutParams.MATCH_PARENT;

        return dialog;
    }
}

これはかなりうまく機能しTextViewますが、Honeycomb 以前のデバイスと Honeycomb デバイスでは色が正しくないことが予想されます。私はHolo.Lightテーマを使用しているので、標準のテキストの色は黒ですが、Honeycomb 以前のデバイスのダイアログの背景色も同様です。また、ハニカム デバイスでは、ダイアログの背景は白です。だから私がしたことは、フォルダー内とフォルダー内にa を追加したことdialogTextColor=whiteです。次に、スタイル属性をすべてに追加する必要がありましたstyles.xmlvaluesdialogTextColor=blackvalues-v11TextViewカスタムダイアログで使用しています。これは ICS までは機能していましたが、その理由は明らかです -> v11. 変更することもできますが、すべてを正しく行うカスタム ダイアログが必要です。アプリケーションのテーマ、ダイアログの幅、の標準ボタン、タイトル、アイコンAlertDialog

4

1 に答える 1

11

ここでの秘訣は、コンテキストがテーマに関連付けられていることです。そのテーマは、デフォルトのテキストの色など、あらゆる種類のものを決定します。

Honeycomb以前のダイアログは、明るいテーマのアクティビティから生成されたものでも暗いテーマのアクティビティから生成されたものでも、常に同じテーマでした。リストを除いて、ダイアログは暗い背景、明るい前景でした。Honeycomb以降では、ダイアログには、それらを生成するアクティビティによって決定されるさまざまなテーマがあります。

Dialog#getContext()ダイアログのコンテンツを膨らませるときは、ダイアログを生成したアクティビティではなく、メソッドによって返されるコンテキストを常に使用してください。上記を取得するために使用するコード行の代わりに、次のことをLayoutInflater試してください。

LayoutInflater inflater = LayoutInflater.from(getContext());

編集:ダイアログの代わりにAlertDialog.Builderを使用しているようです。AlertDialog.BuilderはgetContext()、この目的のためにAPI 11(Android 3.0、別名Honeycomb)にメソッドを追加しましたが、それ以前は存在していませんでした。ContextThemeWrapper古いデバイス用に、を使用して独自のテーマコンテキストを構築できます。古いバージョンのプラットフォームでそのメソッドを呼び出そうとしないように注意してください。あなたは簡単なチェックでそれを守ることができます:

Context themedContext;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    themedContext = getContext();
} else {
    themedContext = new ContextThemeWrapper(activity, android.R.style.Theme_Dialog);
}
LayoutInflater inflater = LayoutInflater.from(themedContext);
于 2011-12-17T20:49:42.547 に答える