web-dev-qa-db-fra.com

Android: Comment créer un dialogue sans titre?

J'essaie de générer un dialogue personnalisé dans Android. Je crée mon dialogue comme ceci:

dialog = new Dialog(this);
dialog.setContentView(R.layout.my_dialog);

Tout fonctionne bien sauf le titre du dialogue. Même si je ne définit pas le titre de la boîte de dialogue, la fenêtre contextuelle de la boîte de dialogue comporte un espace vide à l'emplacement de la boîte de dialogue.

Est-il possible de cacher cette partie du dialogue?

Je l'ai essayé avec un AlertDialog mais il semble que la mise en page ne soit pas correctement définie:

LayoutInflater inflater = 
    (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.map_dialog, null);

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setView(view);

// dialog = new Dialog(this);
// dialog.setContentView(R.layout.map_dialog);

dialog = builder.create();

((TextView) dialog.findViewById(R.id.nr)).setText(number);

Si j'utilise ce code, j'obtiens une exception de pointeur nulle dans la dernière ligne. La boîte de dialogue n'est pas nulle et le TextView que j'essaie de récupérer n'existe pas.
Si je supprime la mise en commentaire de la partie dans laquelle j'utilise le constructeur de dialogues, tout fonctionne correctement sauf pour le titre situé au-dessus de ma présentation de dialogue.

261
Janusz

Vous pouvez masquer le titre d'un dialogue en utilisant:

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);


Version précédente de cette réponse, qui est trop compliquée:

Vous devez utiliser un AlertDialog. Il y a une bonne explication sur le site Android du développeur à propos de boîtes de dialogue personnalisées .

En résumé, vous le faites avec un code tel que copié ci-dessous sur le site officiel. Cela prend un fichier layot ​​personnalisé, le gonfle, lui donne un texte de base et une icône, puis le crée. Vous l'afficheriez alors avec alertDialog.show().

AlertDialog.Builder builder;
AlertDialog alertDialog;

Context mContext = getApplicationContext();
LayoutInflater inflater = (LayoutInflater)
        mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.custom_dialog,
        (ViewGroup) findViewById(R.id.layout_root));

TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello, this is a custom dialog!");
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.Android);

builder = new AlertDialog.Builder(mContext);
builder.setView(layout);
alertDialog = builder.create();

En réponse au commentaire:

Je suppose que TextView avec l'id nr est dans la vue que vous gonflez avec View view = inflater..... Si tel est le cas, vous ne devez modifier qu'un bit: au lieu de dialog.findView..., rendez-le view.findView.... Ensuite, une fois que vous avez terminé, pensez à utiliser dialog.show () ou même builder.show () sans vous soucier de faire builder.create ().

201
Steve Haley

FEATURE_NO_TITLE fonctionne lors de la création d'une boîte de dialogue à partir de zéro, comme dans:

Dialog dialog = new Dialog(context);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

Mais cela ne fonctionne pas lors de la création d'un AlertDialog (ou de l'utilisation du générateur), car il désactive déjà le titre et en utilise un personnalisé en interne.

J'ai examiné les sources du SDK, et je pense qu'il est impossible de contourner le problème. Donc, pour supprimer l'espacement en haut, la seule solution est de créer une boîte de dialogue personnalisée à partir de zéro, à l'aide de la classe Dialog directement.

En outre, vous pouvez le faire avec un style, par exemple dans styles.xml:

<style name="FullHeightDialog" parent="Android:style/Theme.Dialog">
   <item name="Android:windowNoTitle">true</item>
</style>

Puis:

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);
584
olivierg

Dans votre code, ajoutez cette ligne

requestWindowFeature(Window.FEATURE_NO_TITLE);  

Ou en XML utiliser un thème

Android:theme="@Android:style/Theme.NoTitleBar"

XML serait une meilleure implémentation car avec la version du code, la barre de titre est créée puis supprimée, ce qui représente un gaspillage de ressources.

Ok bien essayer mais ça ne marche pas. Je reçois: Android.view.WindowManager $ BadTokenException: impossible d’ajouter window - token null n’est pas pour une application si je veux afficher la boîte de dialogue.

Changez le type de dialogue d'alerte en dialogue de système (par exemple, TYPE_SYSTEM_OVERLAY) et voyez si cela résout votre problème.

67
Donal Rafferty

Utilisez comme ceci:

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 

Cela supprimera toute barre de titre de la fenêtre de dialogue.

60
alok tiwari

Utilisez le code ci-dessous avant setcontentview: -

    Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    dialog.setContentView(R.layout.custom_dialog);

Note: Vous devez avoir le code ci-dessus, dans le même ordre et la même ligne. requestWindowFeature doit être avant la ligne setContentView.

58
duggu

vous pouvez supprimer le titre par

dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

où dialogue est le nom de mon dialogue.

38
shailendra

Dans votre code, si vous utilisez requestWindowFeature(Window.FEATURE_NO_TITLE);, assurez-vous qu'il est placé avant dialog.setContentView();, sinon l'application provoquerait un blocage.

29
Szymon Morawski

J'ai trouvé Three Way pour le faire>

1) Utilisation de requestWindowFeature

Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(dialog.getWindow().FEATURE_NO_TITLE); 

2) Utiliser le style (style.xml)

<style name="FullHeightDialog" parent="Android:style/Theme.Dialog">
   <item name="Android:windowNoTitle">true</item>
</style>

Dialog dialog = new Dialog(context, R.style.FullHeightDialog);

3) Utilisation du thème XML dans AndroidManifest.xml

 Android:theme="@Android:style/Theme.NoTitleBar"
10
Nirav Ranpara

Dans votre classe Custom_Dialog.Java, ajoutez requestWindowFeature(Window.FEATURE_NO_TITLE)

public class Custom_Dialog extends Dialog {

    protected Custom_Dialog(Context context, int theme) {
        super(context, theme);
        // TODO Auto-generated constructor stub
        requestWindowFeature(Window.FEATURE_NO_TITLE); //This line 
    }
}
10
M_K

La réponse d'Olivierg a fonctionné pour moi et constitue la meilleure solution si la création d'une classe de dialogue personnalisée est la voie à suivre. Cependant, cela me dérangeait de ne pas pouvoir utiliser la classe AlertDialog. Je voulais pouvoir utiliser le style système par défaut AlertDialog. La création d'une classe de dialogue personnalisée n'aurait pas ce style.

J'ai donc trouvé une solution (bidouille) qui fonctionnera sans avoir à créer une classe personnalisée, vous pouvez utiliser les générateurs existants.

AlertDialog place une vue au-dessus de votre vue du contenu en tant qu'espace réservé pour le titre. Si vous trouvez la vue et définissez la hauteur sur 0, l'espace disparaît.

Je l'ai testé sur les versions 2.3 et 3.0 jusqu'à présent, il est possible que cela ne fonctionne pas encore sur toutes les versions.

Voici deux méthodes d'assistance pour le faire:

/**
 * 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;
}

Voici un exemple d'utilisation:

    Dialog dialog = new AlertDialog.Builder(this)
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, true);

Si vous l'utilisez avec un DialogFragment, substituez la méthode onCreateDialog de DialogFragment. Puis créez et retournez votre boîte de dialogue comme dans le premier exemple ci-dessus. Le seul changement est que vous devez transmettre false comme troisième paramètre (show) pour qu'il n'appelle pas show () dans la boîte de dialogue. Le DialogFragment gérera cela plus tard.

Exemple:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = new AlertDialog.Builder(getContext())
        .setView(yourCustomView)
        .create();

    showDialogWithNoTopSpace(yourCustomView, dialog, false);
    return dialog;
}

Au fur et à mesure que je teste cela, je serai sûr de mettre à jour avec tous les réglages supplémentaires nécessaires.

7
cottonBallPaws

Je ne sais pas si cette question est toujours d'actualité, mais dans mon cas, lorsque je suis passé de Dialog à DialogFragment,

requestWindowFeature(Window.FEATURE_NO_TITLE);

n'était pas une option, mais je pourrais utiliser

setStyle(STYLE_NO_TITLE, 0);

au lieu de cela avec le même résultat.

6
Analizer

Définissez le titre sur chaîne vide à l'aide du générateur.

    Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("");
...
    builder.show();
4
Szere Dyeri

définissez l'attribut "gravity" sur l'ensemble de la boîte de dialogue sur "center". Ensuite, vous devrez remplacer ce paramètre par tous les composants enfants de la boîte de dialogue que vous ne voulez pas centrer.

3
Matt
dialog=new Dialog(YourActivity.this, 1);  // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);
3
Bamadeva

Si nous utilisons simplement le dialogue sans la setTitle(), cela fonctionnera-t-il en supprimant l'espace du titre?

mUSSDDialog = new AlertDialog.Builder(context).setView(dialogView)
.setPositiveButton(R.string.send_button,DialogListener)
.setNegativeButton(R.string.cancel,DialogListener)
.setCancelable(false).create();
3
jad

en XML utiliser un thème

Android:theme="@Android:style/Theme.NoTitleBar"
3
Asad Rao

Pensez que vous pouvez simplement utiliser ceci maintenant:

AlertDialog dialog = new AlertDialog.Builder(this)
  .setView(view)
  .setTitle("")
  .create()
3
J2K
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "", 
                             "Loading. Please wait...", true);

crée un titre sans dialogue

2
Praveen Kondapalli
public static AlertDialog showAlertDialogWithoutTitle(Context context,String msg) 
     {
      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
      alertDialogBuilder.setMessage(msg).setCancelable(false)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int id) {

         }
        });

       return alertDialogBuilder.create(); 
     }
2

Lorsque vous utilisez AlertDialog, ne pas utiliser setTitle() fait disparaître le titre

2
kostikus

Vous pouvez le faire sans utiliser AlertDialog en définissant une nouvelle classe qui s'étend de Dialog classe comme ceci:

public class myDialog extends Dialog {
    public myDialog(Context context) {
        super(context);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
}
1
Shqear

Après un tas de piratage informatique, je me suis mis au travail:

            Window window = dialog.getWindow();
            View view = window.getDecorView();
            final int topPanelId = getResources().getIdentifier( "topPanel", "id", "Android" );
            LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId);
            topPanel.setVisibility(View.GONE);
1
Chuck D

Utilisez ceci

    Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    dialog.setCancelable(true);
    dialog.setContentView(R.layout.image_show_dialog_layout);
1
Habibur Rahman Ovie

Voici quelque chose que vous pouvez faire avec AlertBuilder pour faire disparaître le titre:

TextView title = new TextView(this);
title.setVisibility(View.GONE);
builder.setCustomTitle(title);
1
rundavidrun

dialogue personnalisé .requestWindowFeature (Window.FEATURE_NO_TITLE);

cela supprimera le titre de la boîte de dialogue personnalisée.

Remarque: ajoutez ces lignes avant d'ajouter du contenu .. par exemple

     dialog_custom = Dialog(activity!!)
    dialog_custom.requestWindowFeature(Window.FEATURE_NO_TITLE)
    dialog_custom.setContentView(R.layout.select_vehicle_type)
    dialog_custom.setCanceledOnTouchOutside(false)
    dialog_custom.setCancelable(true)
0
indrajeet jyoti