câu trả lời của olivierg làm việc cho tôi và là giải pháp tốt nhất nếu tạo một lớp Hộp thoại tùy chỉnh là con đường bạn muốn đi. Tuy nhiên, điều đó làm phiền tôi rằng tôi không thể sử dụng lớp AlertDialog. Tôi muốn có thể sử dụng kiểu AlertDialog mặc định của hệ thống. Tạo một lớp hộp thoại tùy chỉnh sẽ không có kiểu này.
Vì vậy, tôi đã tìm thấy một giải pháp (hack) sẽ hoạt động mà không phải tạo một lớp tùy chỉnh, bạn có thể sử dụng các trình xây dựng hiện có.
AlertDialog đặt Chế độ xem bên trên chế độ xem nội dung của bạn làm trình giữ chỗ cho tiêu đề. Nếu bạn tìm thấy chế độ xem và đặt chiều cao thành 0, không gian sẽ biến mất.
Tôi đã thử nghiệm điều này trên 2.3 và 3.0 cho đến nay, có thể nó chưa hoạt động trên mọi phiên bản.
Đây là hai phương thức trợ giúp để làm điều đó:
/**
* 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;
}
Đây là một ví dụ về cách nó được sử dụng:
Dialog dialog = new AlertDialog.Builder(this)
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, true);
Nếu bạn đang sử dụng tính năng này với DialogFragment, hãy ghi đè onCreateDialog
phương thức DialogFragment . Sau đó tạo và trả lại hộp thoại của bạn như ví dụ đầu tiên ở trên. Thay đổi duy nhất là bạn nên chuyển sai thành tham số thứ 3 (hiển thị) để nó không gọi show () trên hộp thoại. DialogFragment sẽ xử lý việc đó sau.
Thí dụ:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getContext())
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, false);
return dialog;
}
Khi tôi kiểm tra điều này hơn nữa, tôi chắc chắn sẽ cập nhật với bất kỳ tinh chỉnh bổ sung nào cần thiết.