このコマンドを使用してAlertDialogタイトルの色を変更しました
alert.setTitle( Html.fromHtml("<font color='#FF7F27'>Set IP Address</font>"));
しかし、タイトルの下に表示される線の色を変更したいと思います。どうやってやるの ?
注:カスタムレイアウトを使用したくない
残念ながら、これは特に簡単なタスクではありません。 ここでの答えで 、Androidで使用される親スタイルをチェックアウトし、新しい画像を作成し、元のスタイルに基づいて新しいスタイルを作成することで、ListSeparator
の色を調整する方法を詳しく説明します。残念ながら、ListSeparator
のスタイルとは異なり、AlertDialog
テーマは内部のものであるため、親スタイルとして参照することはできません。その小さな青い線を変更する簡単な方法はありません!したがって、カスタムダイアログの作成に頼る必要があります。
それがあなたのお茶じゃないなら... あきらめないで!これをする簡単な方法がなかったので、私は非常に混乱していたので、作るためにgithubで小さなプロジェクトをセットアップしました。迅速にカスタマイズされたホロスタイルのダイアログ(電話がホロスタイルをサポートしていると仮定)。 ここでプロジェクトを見つけることができます: https://github.com/danoz73/QustomDialog
退屈なブルーからエキサイティングなオレンジに簡単に移行できるはずです!
このプロジェクトは基本的にカスタムダイアログビルダーの使用例であり、この例では、元の質問で指定したIPアドレスの例に対応しているように見えるカスタムビューを作成しました。
QustomDialog
を使用して、タイトルまたはディバイダーに希望する異なる色の基本ダイアログ(タイトル、メッセージ)を作成するには、次のコードを使用します。
private String HALLOWEEN_ORANGE = "#FF7F27";
QustomDialogBuilder qustomDialogBuilder = new QustomDialogBuilder(v.getContext()).
setTitle("Set IP Address").
setTitleColor(HALLOWEEN_ORANGE).
setDividerColor(HALLOWEEN_ORANGE).
setMessage("You are now entering the 10th dimension.");
qustomDialogBuilder.show();
カスタムレイアウトを追加するには(たとえば、小さなIPアドレスEditText
を追加するには)、次を追加します。
setCustomView(R.layout.example_ip_address_layout, v.getContext())
設計したレイアウトを使用してビルダーに送信します(IPの例はgithubにあります)。これがお役に立てば幸いです。 ここにジョセフ・アールと彼の答えに感謝します 。
分周器の色:
それは少しハックですが、私にとってはうまく機能し、外部ライブラリなしで動作します(少なくともAndroid 4.4)。
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.dialog)
.setIcon(R.drawable.ic)
.setMessage(R.string.dialog_msg);
//The tricky part
Dialog d = builder.show();
int dividerId = d.getContext().getResources().getIdentifier("Android:id/titleDivider", null, null);
View divider = d.findViewById(dividerId);
divider.setBackgroundColor(getResources().getColor(R.color.my_color));
alert_dialog.xml ファイルで、ダイアログのIDをさらに見つけることができます。例えば。 Android:id/alertTitle
タイトルの色を変更するため...
更新:タイトルの色
タイトルの色を変更するためのハック:
int textViewId = d.getContext().getResources().getIdentifier("Android:id/alertTitle", null, null);
TextView tv = (TextView) d.findViewById(textViewId);
tv.setTextColor(getResources().getColor(R.color.my_color));
これがusefulであることを確認してください...
public void setCustomTitle (View customTitleView)
次のリンクから詳細を取得します。
CustomDialog.Java
Dialog alert = new Dialog(this);
alert.requestWindowFeature(Window.FEATURE_NO_TITLE);
alert.setContentView(R.layout.title);
TextView msg = (TextView)alert.findViewById(R.id.textView1);
msg.setText("Hello Friends.\nIP address : 111.111.1.111");
alert.show();
title.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="vertical" >
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Set IP address"
Android:textColor="#ff0000"
Android:textAppearance="?android:attr/textAppearanceLarge" />
<ImageView
Android:layout_width="fill_parent"
Android:layout_height="2dp"
Android:layout_marginTop="5dp"
Android:background="#00ff00"
/>
<TextView
Android:id="@+id/textView1"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textColor="#775500"
Android:textAppearance="?android:attr/textAppearanceLarge" />
これにより、タイトル、アイコン、および仕切りの色が設定されます。新しいAndroidバージョンで変更される予定です。
public static void colorAlertDialogTitle(AlertDialog dialog, int color) {
int dividerId = dialog.getContext().getResources().getIdentifier("Android:id/titleDivider", null, null);
if (dividerId != 0) {
View divider = dialog.findViewById(dividerId);
divider.setBackgroundColor(color);
}
int textViewId = dialog.getContext().getResources().getIdentifier("Android:id/alertTitle", null, null);
if (textViewId != 0) {
TextView tv = (TextView) dialog.findViewById(textViewId);
tv.setTextColor(color);
}
int iconId = dialog.getContext().getResources().getIdentifier("Android:id/icon", null, null);
if (iconId != 0) {
ImageView icon = (ImageView) dialog.findViewById(iconId);
icon.setColorFilter(color);
}
}
このメソッドを呼び出す前に、dialog.show()を呼び出すことを忘れないでください。
ダイアログのソースコード に従うことで、タイトルがクラスで生成されることがわかりました MidWindow
dialog_title_holo.xml
レイアウトを拡張することによって。したがって、mTitleView
のIDはtitle
であり、ディバイダーのIDはtitleDivider
です。
title
のIDにアクセスするには、単にAndroid.R.id.title
を使用します。
Resources.getSystem().getIdentifier("titleDivider","id", "Android");
によるtitleDivider
のIDへのアクセス
タイトルの方向と色の変更を変更するために使用した最終的なコードは次のとおりです。
TextView mTitle = (TextView)findViewById(Android.R.id.title);
mTitle.setGravity(Gravity.RIGHT|Gravity.CENTER_VERTICAL);
int x = Resources.getSystem().getIdentifier("titleDivider","id", "Android");
View titleDivider = findViewById(x);
titleDivider.setBackgroundColor(getContext().getResources().getColor(R.color.some_color));
そのための「ライブラリ」が必要ない場合は、このひどいハックを使用できます。
((ViewGroup)((ViewGroup)getDialog().getWindow().getDecorView()).getChildAt(0)) //ie LinearLayout containing all the dialog (title, titleDivider, content)
.getChildAt(1) // ie the view titleDivider
.setBackgroundColor(getResources().getColor(R.color.yourBeautifulColor));
これはテストされ、4.xで動作しました。下でテストされていませんが、私の記憶が良好であれば、2.xと3.xで動作するはずです
クラスonCreateViewに次のように記述します。
Dialog d = getDialog();
d.setTitle(Html.fromHtml("<font color='#EC407A'>About</font>"));
int dividerId = d.getContext().getResources().getIdentifier("Android:id/titleDivider", null, null);
View divider = d.findViewById(dividerId);
divider.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
colorPrimaryは、すべての色を格納するcolors.xmlファイルにリンクしています。また、d.setTitle
は、タイトルの色を設定するためのハックな方法を提供します。
警告ダイアログのカスタムレイアウトを作成している場合
このように簡単に追加して色を変更できます
<LinearLayout
Android:id="@+id/DialogTitleBorder"
Android:layout_width="fill_parent"
Android:layout_height="1dip"
Android:layout_below="@id/mExitDialogDesc"
Android:background="#4BBAE3" <!--change color easily -->
>
</LinearLayout>
カスタムタイトルレイアウトを使用する場合、alertDialog.setCustomTitle(customTitle);のように使用できます。
例えば
on UI thread used dialog like
LayoutInflater inflater=LayoutInflater.from(getApplicationContext());
View customTitle=inflater.inflate(R.layout.customtitlebar, null);
AlertDialog.Builder d=new AlertDialog.Builder(this);
d.setCustomTitle(customTitle);
d.setMessage("Message");
d.setNeutralButton("OK", null);
d.show();
customtitlebar.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="wrap_content"
Android:orientation="vertical"
Android:background="#525f67">
<ImageView
Android:id="@+id/icon"
Android:layout_width="40dp"
Android:layout_height="40dp"
Android:src="@drawable/ic_launcher"
Android:layout_alignParentTop="true"
Android:layout_alignParentLeft="true" >
</ImageView>
<TextView
Android:id="@+id/customtitlebar"
Android:layout_width="match_parent"
Android:layout_height="40dp"
Android:textColor="#ffffff"
Android:text="Title Name"
Android:padding="3px"
Android:textStyle="bold"
Android:layout_toRightOf="@id/icon"
Android:layout_alignParentTop="true"
Android:gravity="center_vertical"/>
<ImageView
Android:layout_width="match_parent"
Android:layout_height="2dp"
Android:background="#ff0000"
Android:layout_below="@id/icon"><!-- This is line below the title -->
</ImageView>
</RelativeLayout>
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLACK);
String title = context.getString(R.string.agreement_popup_message);
SpannableStringBuilder ssBuilder = new SpannableStringBuilder(title);
ssBuilder.setSpan(
foregroundColorSpan,
0,
title.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
);
AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder(context);
alertDialogBuilderUserInput.setTitle(ssBuilder)
この答えから続けて: https://stackoverflow.com/a/15285514/186586 、@ daniel-smithからNice githubリポジトリを分岐し、いくつかの改善を行いました。
setItems
メソッドを修正items_list
に仕切りを追加しましたsetItems
メソッドでの無効なアイテムのサポートlistItem
タッチフィードバックダイアログの拡張を使用している場合は、以下を使用します。
requestWindowFeature(Window.FEATURE_NO_TITLE);
ダイアログで仕切りを使用する代わりに、カスタムレイアウトでビューを使用し、ダイアログでレイアウトをカスタムレイアウトとして設定します。
custom_popup.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<com.divago.view.TextViewMedium
Android:id="@+id/txtTitle"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:paddingBottom="10dp"
Android:paddingTop="10dp"
Android:text="AlertDialog"
Android:textColor="@Android:color/black"
Android:textSize="20sp" />
<View
Android:id="@+id/border"
Android:layout_width="match_parent"
Android:layout_height="1dp"
Android:layout_below="@id/txtTitle"
Android:background="@color/txt_dark_grey" />
<ScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_below="@id/border"
Android:scrollbars="vertical">
<com.divago.view.TextViewRegular
Android:id="@+id/txtPopup"
Android:layout_margin="15dp"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
</ScrollView>
</RelativeLayout>
activity.Java:
public void showPopUp(String title, String text) {
LayoutInflater inflater = getLayoutInflater();
View alertLayout = inflater.inflate(R.layout.custom_popup, null);
TextView txtContent = alertLayout.findViewById(R.id.txtPopup);
txtContent.setText(text);
TextView txtTitle = alertLayout.findViewById(R.id.txtTitle);
txtTitle.setText(title);
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setView(alertLayout);
alert.setCancelable(true);
alert.setPositiveButton("Done", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog dialog = alert.create();
dialog.show();
}
ダイアログのスタイリングを1か所で処理する別のソリューションを思い付きました。適用するときに心配する必要はありません。 P)。
使用例:
AlertDialog.Builder builder = new AlertDialog.Builder(context);
AlertDialog dialog = builder.create(); //or builder.show()
DialogViewDecorator.decorate(dialog, Android.R.color.holo_red_light); //can also set the defaut color in the class
実装:
public class DialogViewDecorator {
private static final
@ColorRes int DEFAULT_TITLE_DIVIDER_COLOR = Android.R.color.holo_orange_light;
public static void decorate(Dialog dialog) {
decorate(dialog, DEFAULT_TITLE_DIVIDER_COLOR);
}
/**
* Sets the title divider color when the view is shown by setting DialogInterface.OnShowListener on the dialog.
* <p/>
* If you want to do other things onShow be sure to extend OnDecoratedDialogShownListener(call super.show(...)!)
* and call {@link #decorate(Dialog, int, OnDecoratedDialogShownListener)}.
*
* @param dialog
* @param titleDividerColor
*/
public static void decorate(Dialog dialog, final int titleDividerColor) {
decorate(dialog, titleDividerColor, new OnDecoratedDialogShownListener(titleDividerColor));
}
/**
* Method for setting a extended implementation of OnDecoratedDialogShownListener. Don't forget to call super
* or the titleDividerColor wont be applied!
*
* @param dialog
* @param titleDividerColor
* @param OnShowListener
* @param <T>
*/
public static <T extends OnDecoratedDialogShownListener> void decorate(Dialog dialog, int titleDividerColor, T OnShowListener) {
if (dialog == null || titleDividerColor <= 0) { return; }
if (dialog.isShowing()) {
setTitleDividerColor(dialog, titleDividerColor);
} else {
dialog.setOnShowListener(OnShowListener);
}
}
private static void setTitleDividerColor(DialogInterface dialogInterface, int titleDividerColor) {
try {
Dialog dialog = (Dialog) dialogInterface;
int dividerId = dialog.getContext().getResources().getIdentifier("Android:id/titleDivider", null, null);
View divider = dialog.findViewById(dividerId);
if (divider != null) {
divider.setBackgroundColor(dialog.getContext().getResources().getColor(titleDividerColor));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static class OnDecoratedDialogShownListener implements DialogInterface.OnShowListener {
private int titleDividerColor;
public OnDecoratedDialogShownListener() {
this.titleDividerColor = DEFAULT_TITLE_DIVIDER_COLOR;
}
public OnDecoratedDialogShownListener(int titleDividerColor) {
this.titleDividerColor = titleDividerColor;
}
@Override
public void onShow(DialogInterface dialogInterface) {
setTitleDividerColor(dialogInterface, titleDividerColor);
}
}}