誰かが私を手伝ってくれるかどうか疑問に思いました。カスタムのAlertDialogを作成しようとしています。これを行うために、styles.xmlに次のコードを追加しました。
<resources>
<style name="CustomAlertDialog" parent="Android:Theme.Dialog.Alert">
<item name="Android:windowBackground">@drawable/color_panel_background</item>
</style>
</resources>
主な活動は以下の通りです。
package com.customdialog;
import Android.app.Activity;
import Android.app.AlertDialog;
import Android.app.Dialog;
import Android.content.DialogInterface;
import Android.os.Bundle;
public class CustomDialog extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setTheme(R.style.CustomAlertDialog);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("HELLO!");
builder .setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//MyActivity.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//dialog.cancel();
}
});
AlertDialog alertdialog = builder.create();
alertdialog.show();
}
}
テーマをAlertDialogに適用するには、テーマを現在のコンテキストに設定する必要がありました。
しかし、カスタマイズされたAlertDialogをアプリに表示させることはできないようです。誰かがこれを手伝ってくれる?
Dialog.Java(Android src)では、ContextThemeWrapperが使用されています。そのため、アイデアをコピーして次のようにすることができます。
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom));
そして、あなたが望むようにそれをスタイルする:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AlertDialogCustom" parent="@Android:style/Theme.Dialog">
<item name="Android:textColor">#00FF00</item>
<item name="Android:typeface">monospace</item>
<item name="Android:textSize">10sp</item>
</style>
</resources>
私はここで説明されているようにsdk 1.6を使用してこのAlertDialog
テーマ関連の問題を抱えていました。 http://markmail.org/message/mj5ut56irkrkc4nr
私は次のようにして問題を解決しました:
new AlertDialog.Builder(
new ContextThemeWrapper(context, Android.R.style.Theme_Dialog))
お役に立てれば。
XML形式のファイルでAlertDialogのレイアウトを構成する方法について私のブログに article を書きました。主な問題は、レイアウトパラメータごとに異なるスタイル定義が必要なことです。これはHolo Light Platformバージョン19のAlertDialogスタイルに基づいた定型句で、テキストサイズや背景色などの標準的なレイアウトの要素をすべて網羅したスタイルファイルです。
<style name="AppBaseTheme" parent="Android:Theme.Holo.Light">
...
<item name="Android:alertDialogTheme">@style/MyAlertDialogTheme</item>
<item name="Android:alertDialogStyle">@style/MyAlertDialogStyle</item>
...
</style>
<style name="MyBorderlessButton">
<!-- Set background drawable and text size of the buttons here -->
<item name="Android:background">...</item>
<item name="Android:textSize">...</item>
</style>
<style name="MyButtonBar">
<!-- Define a background for the button bar and a divider between the buttons here -->
<item name="Android:divider">....</item>
<item name="Android:dividerPadding">...</item>
<item name="Android:showDividers">...</item>
<item name="Android:background">...</item>
</style>
<style name="MyAlertDialogTitle">
<item name="Android:maxLines">1</item>
<item name="Android:scrollHorizontally">true</item>
</style>
<style name="MyAlertTextAppearance">
<!-- Set text size and color of title and message here -->
<item name="Android:textSize"> ... </item>
<item name="Android:textColor">...</item>
</style>
<style name="MyAlertDialogTheme">
<item name="Android:windowBackground">@Android:color/transparent</item>
<item name="Android:windowTitleStyle">@style/MyAlertDialogTitle</item>
<item name="Android:windowContentOverlay">@null</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:windowIsFloating">true</item>
<item name="Android:textAppearanceMedium">@style/MyAlertTextAppearance</item>
<!-- If you don't want your own button bar style use
@Android:style/Holo.Light.ButtonBar.AlertDialog
and
?android:attr/borderlessButtonStyle
instead of @style/MyButtonBar and @style/MyBorderlessButton -->
<item name="Android:buttonBarStyle">@style/MyButtonBar</item>
<item name="Android:buttonBarButtonStyle">@style/MyBorderlessButton</item>
</style>
<style name="MyAlertDialogStyle">
<!-- Define background colors of title, message, buttons, etc. here -->
<item name="Android:fullDark">...</item>
<item name="Android:topDark">...</item>
<item name="Android:centerDark">...</item>
<item name="Android:bottomDark">...</item>
<item name="Android:fullBright">...</item>
<item name="Android:topBright">...</item>
<item name="Android:centerBright">...</item>
<item name="Android:bottomBright">...</item>
<item name="Android:bottomMedium">...</item>
<item name="Android:centerMedium">...</item>
</style>
私はこれに苦労していました - あなたはあなたのテーマでAndroid:alertDialogStyle="@style/AlertDialog"
を使ってダイアログの背景をスタイルすることができますが、それはあなたが持っているどんなテキスト設定も無視します。 @rflexorが前述したように、Honeycomb以前のSDKではこれを行うことはできません(Reflection
を使用することもできます)。
私の解決策は、一言で言えば、上記を使用してダイアログの背景をスタイルしてから、カスタムのタイトルとコンテンツビューを設定することでした(SDKのレイアウトと同じレイアウトを使用)。
私のラッパー:
import com.mypackage.R;
import Android.app.AlertDialog;
import Android.content.Context;
import Android.graphics.drawable.Drawable;
import Android.view.View;
import Android.widget.ImageView;
import Android.widget.TextView;
public class CustomAlertDialogBuilder extends AlertDialog.Builder {
private final Context mContext;
private TextView mTitle;
private ImageView mIcon;
private TextView mMessage;
public CustomAlertDialogBuilder(Context context) {
super(context);
mContext = context;
View customTitle = View.inflate(mContext, R.layout.alert_dialog_title, null);
mTitle = (TextView) customTitle.findViewById(R.id.alertTitle);
mIcon = (ImageView) customTitle.findViewById(R.id.icon);
setCustomTitle(customTitle);
View customMessage = View.inflate(mContext, R.layout.alert_dialog_message, null);
mMessage = (TextView) customMessage.findViewById(R.id.message);
setView(customMessage);
}
@Override
public CustomAlertDialogBuilder setTitle(int textResId) {
mTitle.setText(textResId);
return this;
}
@Override
public CustomAlertDialogBuilder setTitle(CharSequence text) {
mTitle.setText(text);
return this;
}
@Override
public CustomAlertDialogBuilder setMessage(int textResId) {
mMessage.setText(textResId);
return this;
}
@Override
public CustomAlertDialogBuilder setMessage(CharSequence text) {
mMessage.setText(text);
return this;
}
@Override
public CustomAlertDialogBuilder setIcon(int drawableResId) {
mIcon.setImageResource(drawableResId);
return this;
}
@Override
public CustomAlertDialogBuilder setIcon(Drawable icon) {
mIcon.setImageDrawable(icon);
return this;
}
}
alert_dialog_title.xml(SDKから取得)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
>
<LinearLayout
Android:id="@+id/title_template"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
Android:gravity="center_vertical"
Android:layout_marginTop="6dip"
Android:layout_marginBottom="9dip"
Android:layout_marginLeft="10dip"
Android:layout_marginRight="10dip">
<ImageView Android:id="@+id/icon"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="top"
Android:paddingTop="6dip"
Android:paddingRight="10dip"
Android:src="@drawable/ic_dialog_alert" />
<TextView Android:id="@+id/alertTitle"
style="@style/?android:attr/textAppearanceLarge"
Android:singleLine="true"
Android:ellipsize="end"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content" />
</LinearLayout>
<ImageView Android:id="@+id/titleDivider"
Android:layout_width="fill_parent"
Android:layout_height="1dip"
Android:scaleType="fitXY"
Android:gravity="fill_horizontal"
Android:src="@drawable/divider_horizontal_bright" />
</LinearLayout>
alert_dialog_message.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/scrollView"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:paddingTop="2dip"
Android:paddingBottom="12dip"
Android:paddingLeft="14dip"
Android:paddingRight="10dip">
<TextView Android:id="@+id/message"
style="?android:attr/textAppearanceMedium"
Android:textColor="@color/dark_grey"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:padding="5dip" />
</ScrollView>
次に、AlertDialog.Builder
の代わりにCustomAlertDialogBuilder
を使用してダイアログを作成し、通常どおりsetTitle
およびsetMessage
を呼び出します。
<style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert">
<!-- Used for the buttons -->
<item name="colorAccent">@color/colorAccent</item>
<!-- Used for the title and text -->
<item name="Android:textColorPrimary">#FFFFFF</item>
<!-- Used for the background -->
<item name="Android:background">@color/teal</item>
</style>
new AlertDialog.Builder(new ContextThemeWrapper(context,R.style.AlertDialogCustom))
.setMessage(Html.fromHtml(Msg))
.setPositiveButton(posBtn, okListener)
.setNegativeButton(negBtn, null)
.create()
.show();
Builderを起動するときにテーマを直接割り当てることができます。
AlertDialog.Builder builder = new AlertDialog.Builder(
getActivity(), R.style.MyAlertDialogTheme);
それからあなたのテーマをあなたのvalues/styles.xml
でカスタマイズしてください
<!-- Alert Dialog -->
<style name="MyAlertDialogTheme" parent="Theme.AppCompat.Dialog.Alert">
<item name="colorAccent">@color/colorAccent</item>
<item name="Android:colorBackground">@color/alertDialogBackground</item>
<item name="Android:windowBackground">@color/alertDialogBackground</item>
</style>
できないと思います。少なくともビルダーとは違います。私は1.6で働いていて、Builder.create()の実装は次のとおりです。
public AlertDialog create() {
final AlertDialog dialog = new AlertDialog(P.mContext);
P.apply(dialog.mAlert);
[...]
}
これはAlertDialogの「テーマに対応しない」コンストラクタを呼び出します。これは次のようになります。
protected AlertDialog(Context context) {
this(context, com.Android.internal.R.style.Theme_Dialog_Alert);
}
AlertDialogには、テーマを変更するための2番目のコンストラクタがあります。
protected AlertDialog(Context context, int theme) {
super(context, theme);
[...]
}
builderが呼び出さないこと.
とにかくDialogがかなり一般的なものであれば、AlertDialogのサブクラスを書いて2番目のコンストラクタを呼び出し、Builderのメカニズムの代わりにそのクラスを使用します。
カスタムダイアログの場合
ダイアログコンストラクタでsuper(context,R.style.<dialog style>)
の代わりにsuper(context)
を呼び出すだけです。
public class MyDialog extends Dialog
{
public MyDialog(Context context)
{
super(context, R.style.Theme_AppCompat_Light_Dialog_Alert)
}
}
AlertDialogの場合
このコンストラクタでalertDialogを作成するだけです。
new AlertDialog.Builder(
new ContextThemeWrapper(context, Android.R.style.Theme_Dialog))
これを行うためのより良い方法は、カスタムダイアログを使用し、ニーズに応じてカスタマイズする方法はカスタムダイアログの例です.....
public class CustomDialogUI {
Dialog dialog;
Vibrator vib;
RelativeLayout rl;
@SuppressWarnings("static-access")
public void dialog(final Context context, String title, String message,
final Runnable task) {
dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom);
dialog.setCancelable(false);
TextView m = (TextView) dialog.findViewById(R.id.message);
TextView t = (TextView) dialog.findViewById(R.id.title);
final Button n = (Button) dialog.findViewById(R.id.button2);
final Button p = (Button) dialog.findViewById(R.id.next_button);
rl = (RelativeLayout) dialog.findViewById(R.id.rlmain);
t.setText(bold(title));
m.setText(message);
dialog.show();
n.setText(bold("Close"));
p.setText(bold("Ok"));
// color(context,rl);
vib = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE);
n.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
vib.vibrate(15);
dialog.dismiss();
}
});
p.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
vib.vibrate(20);
dialog.dismiss();
task.run();
}
});
}
//customize text style bold italic....
public SpannableString bold(String s) {
SpannableString spanString = new SpannableString(s);
spanString.setSpan(new StyleSpan(Typeface.BOLD), 0,
spanString.length(), 0);
spanString.setSpan(new UnderlineSpan(), 0, spanString.length(), 0);
// spanString.setSpan(new StyleSpan(Typeface.ITALIC), 0,
// spanString.length(), 0);
return spanString;
}
}
これがxmlレイアウトです
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="#00000000"
>
<RelativeLayout
Android:id="@+id/rlmain"
Android:layout_width="fill_parent"
Android:layout_height="150dip"
Android:layout_alignParentLeft="true"
Android:layout_centerVertical="true"
Android:background="#569CE3" >
<RelativeLayout
Android:id="@+id/relativeLayout1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true"
Android:layout_centerHorizontal="true"
Android:layout_marginLeft="25dip"
Android:layout_marginTop="10dip" >
<TextView
Android:id="@+id/title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true"
Android:text="Are you Sure?"
Android:textAppearance="?android:attr/textAppearanceMedium"
Android:textColor="#ffffff"
Android:textSize="13dip" />
</RelativeLayout>
<RelativeLayout
Android:id="@+id/relativeLayout2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/relativeLayout1"
Android:layout_alignRight="@+id/relativeLayout1"
Android:layout_below="@+id/relativeLayout1"
Android:layout_marginTop="5dip" >
</RelativeLayout>
<ProgressBar
Android:id="@+id/process"
style="?android:attr/progressBarStyleSmall"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentRight="true"
Android:layout_alignParentTop="true"
Android:layout_marginRight="3dip"
Android:layout_marginTop="3dip" />
<RelativeLayout
Android:id="@+id/relativeLayout3"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_alignLeft="@+id/relativeLayout2"
Android:layout_below="@+id/relativeLayout2"
Android:layout_toLeftOf="@+id/process" >
<TextView
Android:id="@+id/message"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_centerVertical="true"
Android:text="Medium Text"
Android:textAppearance="?android:attr/textAppearanceMedium"
Android:textColor="#ffffff"
Android:textSize="13dip"/>
</RelativeLayout>
<Button
Android:id="@+id/next_button"
Android:layout_width="90dip"
Android:layout_height="35dip"
Android:layout_alignParentBottom="true"
Android:textColor="@drawable/button_text_color"
Android:background="@drawable/blue_button"
Android:layout_marginBottom="5dp"
Android:textSize="10dp"
Android:layout_alignRight="@+id/relativeLayout3"
Android:text="Okay" />
<Button
Android:id="@+id/button2"
Android:text="Cancel"
Android:textColor="@drawable/button_text_color"
Android:layout_width="90dip"
Android:layout_height="35dip"
Android:layout_marginBottom="5dp"
Android:background="@drawable/blue_button"
Android:layout_marginRight="7dp"
Android:textSize="10dp"
Android:layout_alignParentBottom="true"
Android:layout_toLeftOf="@+id/next_button"
/>
</RelativeLayout>
フラグメント内でこれを実行しようとする人は(サポートライブラリ、つまりAPI 11以前を使用して)これを使用する必要があります。
public class LoadingDialogFragment extends DialogFragment {
public static final String ID = "loadingDialog";
public static LoadingDialogFragment newInstance() {
LoadingDialogFragment f = new LoadingDialogFragment();
return f;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
StyleAlertDialog adb = new StyleAlertDialog(getActivity(), R.style.Your_Style);
adb.setView(getActivity().getLayoutInflater().inflate(R.layout.fragment_dialog_layout, null));
return adb;
}
private class StyleAlertDialog extends AlertDialog {
protected StyleAlertDialog(Context context, int theme) {
super(context, theme);
}
}
}
@RflexorはAlertDialogを拡張してコンストラクタを公開するようにナッジをくれました
私はまだテストしていませんが、Arve Waltinの解決策は良さそうです。 AlertDialog.Builder
を拡張し、実際のDialogのtext/title/viewを設定せずに作成するためにすべてのメソッド(例えばsetText
、setTitle
、setView
など)をオーバーライドしますダイアログのビュー内の新しいビューはそこですべてを行います。それからあなたは自由にあなたが好きなようにすべてをスタイルすることができます。
明確にするために、親クラスに関する限り、ビューが設定され、それ以外は何もしません。
カスタム拡張クラスに関する限り、すべてはそのビュー内で行われます。
BuilderのsetView()を使うことで簡単にできます。あなたはあなたの選択の任意のビューを作成してビルダーにフィードすることができます。これはうまくいきます。ダイアログビルダーによってレンダリングされるカスタムTextViewを使用します。私はメッセージを設定しないで、このスペースは私の顧客用テキストビューをレンダリングするために利用されます。