Cette question a déjà été posée: Le titre personnalisé de AlertDialog a une bordure noire
Mais n'a pas répondu de manière satisfaisante - et manque certaines informations.
J'essaie de créer une boîte de dialogue personnalisée dans Android sans titre et sans boutons en bas.
Cependant, la boîte de dialogue résultante contient des "bordures"/"espacements"/quelque chose de noir en haut et en bas de la vue.
De la documentation :
Un dialogue créé avec la classe Dialog de base doit avoir un titre. Si vous n'appelez pas setTitle (), l'espace utilisé pour le titre reste alors vide, mais toujours visible. Si vous ne voulez pas du tout de titre, alors vous devrait créer votre boîte de dialogue personnalisée à l'aide de la classe AlertDialog. Toutefois, car AlertDialog est créé plus facilement avec AlertDialog.Builder classe, vous n’avez pas accès à la méthode setContentView (int) utilisée au dessus de. Au lieu de cela, vous devez utiliser setView (View). Cette méthode accepte une vue objet, vous devez donc gonfler l’objet View racine de la présentation à partir de XML.
Alors c'est ce que j'ai fait:
Welcome.Java
public class Welcome extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.welcomedialog, (ViewGroup)findViewById(R.id.layout_root));
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(layout);
builder.create().show();
}
}
welcomeialog.xml
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:background="@drawable/texturebg"
Android:id="@+id/layout_root"
Android:orientation="vertical"
Android:padding="40px">
...
</LinearLayout>
NOTE: J'ai essayé d'utiliser FrameLayout
comme racine ViewGroup
au lieu de LinearLayout
selon une suggestion que j'ai trouvée quelque part - mais cela n'a pas aidé.
Résultat
public class Welcome extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.welcomedialog, (ViewGroup)findViewById(R.id.layout_root));
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(layout);
AlertDialog dialog = builder.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
dialog.show();
}
}
Ca n'a pas marché pour moi.
Si vous regardez la source de classe AlertDialog , vous verrez que la plupart des méthodes sont simplement des méthodes proxy (façade) autour de private AlertController mAlert
.
En regardant la source de la classe AlertController , vous verrez 4 variables de membre intéressantes:
private int mViewSpacingLeft;
private int mViewSpacingTop;
private int mViewSpacingRight;
private int mViewSpacingBottom;
private boolean mViewSpacingSpecified = false;
Régler mViewSpacingSpecified
sur true
supprimera les bordures situées en haut et en bas de la boîte de dialogue.
Ceci est fait correctement en changeant cette ligne:
dialog.setView(layout);
à:
dialog.setView(layout, 0, 0, 0, 0);
dialog.setInverseBackgroundForced(true);
utilisez ce qui précède dans votre code pour supprimer la bordure de la boîte de dialogue d'alerte.
Reportez-vous ceci LINK pour InverseBackgroundForced.
UPDATED Essayez ce code ::::
public class Welcome extends Activity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
AlertDialog.Builder builder = new AlertDialog.Builder(Welcome.this);
LayoutInflater _inflater = LayoutInflater.from(Welcome.this);
View view = _inflater.inflate(R.layout.welcomedialog,null);
builder.setView(view);
AlertDialog alert = builder.create();
alert.show();
}
}
Note :: Essayez également en supprimant Android: padding = "40px" de welcomeialog.xml.
Dans mon cas, cette frontière a été provoquée par le thème de l'activité parent pour AlertDialog. Pour supprimer complètement la frontière, donnez-lui un thème différent (dans ce cas, Holo):
AlertDialog.Builder builder = new AlertDialog.Builder(
new ContextThemeWrapper(this, Android.R.style.Theme_Holo)
);
Cela a résolu le problème pour moi. J'espère que cela t'aides!
Juste pour clarifier la réponse de Steve, cela peut être fait facilement. Par exemple, dans mon cas, la vue que je configurais dans la boîte de dialogue était une vue Web.
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
WebView webView = new WebView(getActivity());
webView.loadUrl(" url to show ");
OnClickListener clickListenerOk = new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
...
}
};
OnClickListener clickListenerCancel = new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
...
}
};
AlertDialog dialog = new AlertDialog.Builder(getActivity())
.setPositiveButton("OK", clickListenerOk)
.setNegativeButton("Cancel",clickListenerCancel)
.create();
dialog.setView(webView, 0, 0, 0, 0);
return dialog;
}
setBackgroundDrawable(new ColorDrawable(0));
Appelez cela dans votre dialogue.