คำตอบของ oliviergเหมาะกับฉันและเป็นทางออกที่ดีที่สุดหากสร้างคลาสไดอะล็อกที่กำหนดเองเป็นเส้นทางที่คุณต้องการไป อย่างไรก็ตามมันรบกวนฉันว่าฉันไม่สามารถใช้คลาส AlertDialog ฉันต้องการที่จะใช้รูปแบบการแจ้งเตือนระบบเริ่มต้น การสร้างคลาสไดอะล็อกที่กำหนดเองจะไม่มีสไตล์นี้
ดังนั้นฉันจึงพบโซลูชัน (แฮ็ค) ที่จะทำงานโดยไม่ต้องสร้างคลาสที่กำหนดเองคุณสามารถใช้ผู้สร้างที่มีอยู่
AlertDialog ทำให้มุมมองเหนือมุมมองเนื้อหาของคุณเป็นตัวยึดตำแหน่งสำหรับชื่อเรื่อง หากคุณพบมุมมองและตั้งความสูงเป็น 0 ช่องว่างจะหายไป
ฉันได้ทดสอบสิ่งนี้กับ 2.3 และ 3.0 แล้วเป็นไปได้ว่ามันยังใช้งานไม่ได้กับทุกรุ่น
นี่คือวิธีการช่วยเหลือสองวิธีในการทำ:
/**
* Show a Dialog with the extra title/top padding collapsed.
*
* @param customView The custom view that you added to the dialog
* @param dialog The dialog to display without top spacing
* @param show Whether or not to call dialog.show() at the end.
*/
public static void showDialogWithNoTopSpace(final View customView, final Dialog dialog, boolean show) {
// Now we setup a listener to detect as soon as the dialog has shown.
customView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Check if your view has been laid out yet
if (customView.getHeight() > 0) {
// If it has been, we will search the view hierarchy for the view that is responsible for the extra space.
LinearLayout dialogLayout = findDialogLinearLayout(customView);
if (dialogLayout == null) {
// Could find it. Unexpected.
} else {
// Found it, now remove the height of the title area
View child = dialogLayout.getChildAt(0);
if (child != customView) {
// remove height
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams();
lp.height = 0;
child.setLayoutParams(lp);
} else {
// Could find it. Unexpected.
}
}
// Done with the listener
customView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
// Show the dialog
if (show)
dialog.show();
}
/**
* Searches parents for a LinearLayout
*
* @param view to search the search from
* @return the first parent view that is a LinearLayout or null if none was found
*/
public static LinearLayout findDialogLinearLayout(View view) {
ViewParent parent = (ViewParent) view.getParent();
if (parent != null) {
if (parent instanceof LinearLayout) {
// Found it
return (LinearLayout) parent;
} else if (parent instanceof View) {
// Keep looking
return findDialogLinearLayout((View) parent);
}
}
// Couldn't find it
return null;
}
นี่คือตัวอย่างของวิธีการใช้งาน:
Dialog dialog = new AlertDialog.Builder(this)
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, true);
หากคุณใช้สิ่งนี้ด้วย DialogFragment ให้แทนที่onCreateDialog
วิธีของ DialogFragment จากนั้นสร้างและส่งคืนกล่องโต้ตอบของคุณเหมือนตัวอย่างแรกข้างต้น การเปลี่ยนแปลงเพียงอย่างเดียวคือคุณควรส่งเท็จเป็นพารามิเตอร์ที่ 3 (แสดง) เพื่อที่จะไม่เรียกใช้ show () ในกล่องโต้ตอบ DialogFragment จะจัดการในภายหลัง
ตัวอย่าง:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getContext())
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, false);
return dialog;
}
ในขณะที่ฉันทำการทดสอบเพิ่มเติมฉันจะแน่ใจว่าได้อัปเดตเมื่อมีการปรับแต่งเพิ่มเติมใด ๆ ที่จำเป็น