Jawaban olivierg bekerja untuk saya dan merupakan solusi terbaik jika membuat kelas Dialog khusus adalah rute yang ingin Anda tuju. Namun, itu mengganggu saya bahwa saya tidak bisa menggunakan kelas AlertDialog. Saya ingin dapat menggunakan sistem gaya AlertDialog standar. Membuat kelas dialog khusus tidak akan memiliki gaya ini.
Jadi saya menemukan solusi (retas) yang akan berfungsi tanpa harus membuat kelas khusus, Anda dapat menggunakan pembangun yang ada.
AlertDialog menempatkan Tampilan di atas tampilan konten Anda sebagai pengganti untuk judul tersebut. Jika Anda menemukan tampilan dan mengatur ketinggian ke 0, ruang hilang.
Saya telah menguji ini pada 2.3 dan 3.0 sejauh ini, mungkin masih belum berfungsi pada setiap versi.
Berikut adalah dua metode pembantu untuk melakukannya:
/**
* 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;
}
Berikut adalah contoh penggunaannya:
Dialog dialog = new AlertDialog.Builder(this)
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, true);
Jika Anda menggunakan ini dengan DialogFragment, ganti onCreateDialog
metode DialogFragment . Kemudian buat dan kembalikan dialog Anda seperti contoh pertama di atas. Satu-satunya perubahan adalah Anda harus memberikan false sebagai parameter ke-3 (show) sehingga tidak memanggil show () pada dialog. DialogFragment akan menanganinya nanti.
Contoh:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getContext())
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, false);
return dialog;
}
Saat saya menguji ini lebih lanjut, saya pasti akan memperbarui dengan tweak tambahan yang diperlukan.