oliviergs antwort bei mir funktioniert und ist die beste Lösung, wenn das Erstellen einer benutzerdefinierten Dialogklasse der Weg ist, den Sie gehen möchten. Es hat mich jedoch gestört, dass ich die AlertDialog-Klasse nicht verwenden konnte. Ich wollte den Standardsystem-AlertDialog-Stil verwenden können. Das Erstellen einer benutzerdefinierten Dialogklasse hätte diesen Stil nicht.
Also habe ich eine Lösung (Hack) gefunden, die funktioniert, ohne dass eine benutzerdefinierte Klasse erstellt werden muss. Sie können die vorhandenen Builder verwenden.
Der AlertDialog platziert eine Ansicht über Ihrer Inhaltsansicht als Platzhalter für den Titel. Wenn Sie die Ansicht finden und die Höhe auf 0 setzen, wird das Leerzeichen entfernt.
Ich habe dies bisher auf 2.3 und 3.0 getestet, es ist möglich, dass es noch nicht auf jeder Version funktioniert.
Hier sind zwei Hilfsmethoden, um dies zu tun:
/**
* 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;
}
Hier ist ein Beispiel für die Verwendung:
Dialog dialog = new AlertDialog.Builder(this)
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, true);
Wenn Sie dies mit einem DialogFragment verwenden, überschreiben Sie die DialogFragments onCreateDialog
Methode . Erstellen Sie dann Ihren Dialog und geben Sie ihn wie im ersten Beispiel oben zurück. Die einzige Änderung besteht darin, dass Sie false als dritten Parameter (show) übergeben sollten, damit im Dialog nicht show () aufgerufen wird. Das DialogFragment wird das später erledigen.
Beispiel:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getContext())
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, false);
return dialog;
}
Wenn ich dies weiter teste, werde ich sicher sein, dass ich mit zusätzlichen Optimierungen aktualisiere.