olivierg'in yanıtı benim için çalıştı ve özel bir Dialog sınıfı oluşturmak istediğiniz yolsa en iyi çözümdür. Ancak, AlertDialog sınıfını kullanamam beni rahatsız etti. Varsayılan sistem AlertDialog stilini kullanabilmek istedim. Özel bir iletişim sınıfı oluşturmanın bu tarzı olmaz.
Bu yüzden özel bir sınıf oluşturmak zorunda kalmadan çalışacak bir çözüm (hack) buldum, mevcut inşaatçıları kullanabilirsiniz.
AlertDialog, başlık için yer tutucu olarak içerik görünümünüzün üzerine bir Görünüm koyar. Görünümü bulup yüksekliği 0 olarak ayarlarsanız, alan kaybolur.
Bunu 2.3 ve 3.0'da test ettim, henüz her versiyonda çalışmaz.
İşte bunu yapmak için iki yardımcı yöntem:
/**
* 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;
}
İşte nasıl kullanıldığına dair bir örnek:
Dialog dialog = new AlertDialog.Builder(this)
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, true);
Bunu bir DialogFragment ile kullanıyorsanız, DialogFragment'ın onCreateDialog
yöntemini geçersiz kılın . Ardından iletişim kutunuzu oluşturun ve yukarıdaki ilk örnek gibi geri gönderin. Tek değişiklik, iletişim kutusundaki show () öğesini çağırmamak için 3. parametre (show) olarak false iletmenizdir. DialogFragment bunu daha sonra ele alacaktır.
Misal:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getContext())
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, false);
return dialog;
}
Bunu daha fazla test ederken, gerekli ek ayarlarla güncelleyeceğinizden emin olacağım.