ฉันเปลี่ยนสีของชื่อ AlertDialog โดยใช้คำสั่งนี้
alert.setTitle( Html.fromHtml("<font color='#FF7F27'>Set IP Address</font>"));
แต่ฉันต้องการเปลี่ยนสีของเส้นที่ปรากฏใต้ชื่อเรื่อง ฉันจะทำอย่างไร
หมายเหตุ: ฉันไม่ต้องการใช้เค้าโครงที่กำหนดเอง
ฉันเปลี่ยนสีของชื่อ AlertDialog โดยใช้คำสั่งนี้
alert.setTitle( Html.fromHtml("<font color='#FF7F27'>Set IP Address</font>"));
แต่ฉันต้องการเปลี่ยนสีของเส้นที่ปรากฏใต้ชื่อเรื่อง ฉันจะทำอย่างไร
หมายเหตุ: ฉันไม่ต้องการใช้เค้าโครงที่กำหนดเอง
คำตอบ:
น่าเสียดายที่นี่ไม่ใช่งานง่ายๆที่จะทำให้สำเร็จ ในคำตอบของฉันที่นี่ฉันให้รายละเอียดเกี่ยวกับวิธีการปรับสีของ a ListSeparator
โดยเพียงแค่ตรวจสอบสไตล์หลักที่ Android ใช้สร้างภาพใหม่และสร้างสไตล์ใหม่ตามต้นฉบับ น่าเสียดายที่แตกต่างจาก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) ฉันหวังว่านี่จะช่วยได้. ขอบคุณมากที่โจเซฟเอิร์ลและคำตอบของเขาที่นี่
setItems
ในกล่องโต้ตอบที่กำหนดเองนี้ เมื่อฉันเพิ่มรายการมันจะเลื่อนชื่อด้านล่างรายการจริงๆ วิธีแก้ไขปัญหานี้
สีแบ่ง:
มันเป็นการแฮ็กเล็กน้อย แต่ใช้งานได้ดีสำหรับฉันและใช้งานได้โดยไม่มีไลบรารีภายนอก (อย่างน้อยใน 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 เช่น. android:id/alertTitle
สำหรับการเปลี่ยนสีชื่อเรื่อง ...
UPDATE: สีของชื่อเรื่อง
แฮ็คเพื่อเปลี่ยนสีชื่อเรื่อง:
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));
android.util.AndroidRuntimeException: requestFeature() must be called before adding content
ที่นี่
DialogFragment
ที่สีของชื่อเรื่องไม่มีรหัสandroid:id/alertTitle
แต่ฉันไม่พบสีที่ถูกต้อง
NullPointerException
ถึงsetTextColor()
ตรวจสอบว่ามีประโยชน์สำหรับคุณ ...
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 () ก่อนเรียกเมธอดนี้
จากการทำตามซอร์สโค้ด Dialogฉันพบว่า Title ถูกสร้างขึ้นใน Class MidWindow
โดยการขยายdialog_title_holo.xml
เลย์เอาต์ เพื่อให้ประชาชนของmTitleView
เป็นtitle
และ Id titleDivider
ของแบ่งเป็น
เราสามารถเข้าถึง Id ของง่ายๆโดยการtitle
android.R.id.title
และเข้าถึง Id ของtitleDivider
โดยResources.getSystem().getIdentifier("titleDivider","id", "android");
รหัสสุดท้ายที่ฉันใช้เพื่อเปลี่ยนทิศทางของชื่อเรื่องและเปลี่ยนสีคือ:
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);
ตัวอย่าง
ในกล่องโต้ตอบการใช้เธรด UI เช่น:
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>
นี่คืออีกวิธีหนึ่ง (ตามคำตอบที่แนะนำ) ที่จัดการรูปแบบของกล่องโต้ตอบในชั้นเรียนเดียวโดยไม่ต้องกังวลเกี่ยวกับสถานะของกล่องโต้ตอบเมื่อคุณเปลี่ยนรูปแบบ - กล่องโต้ตอบสามารถแสดงอยู่แล้วหรือเพิ่งเริ่มต้นได้
ตัวอย่างการใช้งาน:
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);
}
}}
ต่อจากคำตอบนี้: https://stackoverflow.com/a/15285514/1865860ฉันแยก github repo ที่ดีจาก @ daniel-smith และทำการปรับปรุงบางอย่าง:
setItems
วิธีการคงที่items_list
setItems
วิธีการlistItem
สัมผัสความคิดเห็นแทนที่จะใช้ตัวแบ่งในกล่องโต้ตอบให้ใช้มุมมองในเค้าโครงแบบกำหนดเองและตั้งค่าเค้าโครงเป็นเค้าโครงที่กำหนดเองในกล่องโต้ตอบ
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();
}
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)
ในกรณีที่คุณใช้การขยายกล่องโต้ตอบให้ใช้:
requestWindowFeature(Window.FEATURE_NO_TITLE);