olivierg's answer funzionato per me ed è la soluzione migliore se la creazione di una classe di dialogo personalizzato è il percorso che si voglio andare. Tuttavia, mi dava fastidio il fatto che non potevo usare la classe AlertDialog. Volevo essere in grado di utilizzare lo stile AlertDialog di sistema predefinito. La creazione di una classe di dialogo personalizzata non avrebbe questo stile.
Quindi ho trovato una soluzione (hack) che funzionerà senza dover creare una classe personalizzata, è possibile utilizzare i builder esistenti.
AlertDialog mette una vista sopra la vista del contenuto come segnaposto per il titolo. Se trovi la vista e imposta l'altezza su 0, lo spazio scompare.
Ho provato questo su 2.3 e 3.0 finora, è possibile che non funzioni ancora su tutte le versioni.
Qui ci sono due metodi di supporto per farlo:
/**
* 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;
}
Ecco un esempio di come viene utilizzato:
Dialog dialog = new AlertDialog.Builder(this)
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, true);
Se si utilizza questo con un DialogFragment, ignorare del onCreateDialog
DialogFragment metodo. Quindi crea e ritorna la tua finestra di dialogo come il primo esempio sopra. L'unica modifica è che devi passare falso come terzo parametro (mostra) in modo che non chiami show() nella finestra di dialogo. Il DialogFragment gestirà quello più tardi.
Esempio:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getContext())
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, false);
return dialog;
}
Come ho prova questo ulteriore sarò sicuro di aggiornare eventuali modifiche aggiuntive necessarie.
avete risolto i vostri problemi? –
@Janusz ripeti la risposta a http://stackoverflow.com/a/3407871/632951 – Pacerier
prova http://stackoverflow.com/questions/6263639/android-dialog-removing-title-bar anziché la risposta precedente .. .semplice risposta –