web-dev-qa-db-fra.com

AlertDialog: Comment supprimer les bordures noires au-dessus et au-dessous de la vue

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

enter image description hereenter image description here


setBackgroundDrawable Suggestion

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.

31
Steve

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);
39
Steve
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.

8
Shankar Agarwal

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!

6
Prismatica

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;
}
1
jsidera
setBackgroundDrawable(new ColorDrawable(0));

Appelez cela dans votre dialogue.

0
Changwei Yao