J'essaie de générer une boîte de dialogue personnalisée 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 de la boîte de 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 a un espace vide à la position de la boîte de dialogue.
Existe-t-il un moyen de masquer cette partie de la boîte de 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, donc le TextView que j'essaie de récupérer n'existe pas.
Si je décommente la partie où j'utilise le constructeur de boîte de dialogue, tout fonctionne bien, sauf pour le titre au-dessus de ma disposition de boîte de dialogue.
la source
Réponses:
Vous pouvez masquer le titre d'une boîte de dialogue à l'aide de:
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 du développeur Android à propos des boîtes de dialogue personnalisées .En résumé, vous le faites avec du code comme copié ci-dessous sur le site officiel. Cela prend un fichier layot personnalisé, le gonfle, lui donne du texte et une icône de base, puis le crée. Vous le montriez alors avec
alertDialog.show()
.En réponse au commentaire:
Je suppose que TextView avec l'ID
nr
est dans la vue avec laquelle vous gonflezView view = inflater....
. Si c'est le cas, vous devez changer un seul bit: au lieu de ledialog.findView...
faireview.findView...
. Ensuite, une fois que vous avez fait cela, n'oubliez pas d'utiliser dialog.show (), ou même builder.show () sans vous soucier de faire builder.create ().la source
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
FEATURE_NO_TITLE fonctionne lors de la création d'une boîte de dialogue à partir de zéro, comme dans:
Mais cela ne fonctionne pas lors de la création d'un AlertDialog (ou de l'utilisation du Builder), car il désactive déjà le titre et en utilise un personnalisé en interne.
J'ai regardé les sources du SDK et je pense que cela ne peut pas être résolu. Donc, pour supprimer l'espacement supérieur, la seule solution consiste à créer une boîte de dialogue personnalisée à partir de zéro IMO, en utilisant directement la classe Dialog.
De plus, on peut le faire avec un style, par exemple dans styles.xml:
Puis:
la source
Dialog
, mais créer unAlertDialog
était beaucoup plus facile. Comme il est indiqué dans les documents :The Dialog class is the base class for dialogs, but you should avoid instantiating Dialog directly. Instead, use one of the following subclasses: <AlertDialog and others described here>
. LeAlertDialog
gère également les éléments du cycle de vie et ok / cancel de manière simple.Dans votre code ajoutez cette ligne
Ou en XML utilisez un thème
XML serait une meilleure implémentation car avec la version du code, la barre de titre est créée puis supprimée, ce qui est un gaspillage de ressources
Modifiez le type de boîte de dialogue d'alerte en boîte de dialogue système (par exemple, TYPE_SYSTEM_OVERLAY) et voyez si cela résout votre problème
la source
Utilisez comme ceci:
Cela supprimera toute barre de titre de la fenêtre de dialogue.
la source
Utilisez le code ci-dessous avant
setcontentview
: -Remarque : Vous devez avoir le code ci-dessus, dans le même ordre et la même ligne.
requestWindowFeature
doit être avant la ligne setContentView.la source
vous pouvez supprimer le titre en
où dialogue est le nom de ma boîte de dialogue.
la source
Dans votre code, si vous utilisez,
requestWindowFeature(Window.FEATURE_NO_TITLE);
assurez-vous qu'il va avant,dialog.setContentView();
sinon cela entraînera le blocage de l'application.la source
J'ai trouvé Three Way pour ce faire>
1) Utilisation de requestWindowFeature
2) Utilisation du style (style.xml)
3) Utilisation du thème XML dans AndroidManifest.xml
la source
Dans votre classe Custom_Dialog.java, ajoutez
requestWindowFeature(Window.FEATURE_NO_TITLE)
la source
La réponse d'Olivierg a fonctionné pour moi et est la meilleure solution si la création d'une classe de dialogue personnalisée est l'itinéraire que vous souhaitez emprunter. Cependant, cela me dérangeait de ne pas pouvoir utiliser la classe AlertDialog. Je voulais pouvoir utiliser le style par défaut du système AlertDialog. La création d'une classe de boîte de dialogue personnalisée n'aurait pas ce style.
J'ai donc trouvé une solution (hack) qui fonctionnera sans avoir à créer une classe personnalisée, vous pouvez utiliser les constructeurs existants.
Le AlertDialog place une vue au-dessus de votre vue de 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.
J'ai testé cela sur 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:
Voici un exemple de la façon dont il est utilisé:
Si vous l'utilisez avec un DialogFragment, remplacez la
onCreateDialog
méthode de DialogFragment . Ensuite, créez et renvoyez votre boîte de dialogue comme le premier exemple ci-dessus. Le seul changement est que vous devez passer false comme 3e paramètre (show) pour qu'il n'appelle pas show () dans la boîte de dialogue. DialogFragment s'en occupera plus tard.Exemple:
Au fur et à mesure que je testerai cela, je serai sûr de mettre à jour avec tous les réglages supplémentaires nécessaires.
la source
Je ne sais pas si cette question est toujours d'actualité, mais dans mon cas, lorsque je suis passé de Dialog à DialogFragment,
n'était pas une option, mais je pouvais utiliser
au lieu de cela avec le même résultat.
la source
setStyle(STYLE_NO_TITLE, 0);
) ira dans la méthode onCreate de votre classe DialogFragment.Définissez le titre sur une chaîne vide à l'aide du générateur.
la source
définissez l'attribut "gravité" sur l'ensemble de la boîte de dialogue sur "centre". Vous devrez ensuite remplacer ce paramètre par tous les composants enfants de la boîte de dialogue que vous ne souhaitez pas centrer.
la source
la source
en XML utiliser un thème
la source
Si nous utilisons simplement la boîte de dialogue sans le
setTitle()
, est-ce que ça va fonctionner pour supprimer l'espace du titre?la source
Pensez que vous pouvez simplement l'utiliser maintenant:
la source
crée une boîte de dialogue sans titre
la source
la source
Lorsque vous utilisez AlertDialog, ne pas utiliser
setTitle()
fait disparaître le titrela source
Après un tas de piratage, je l'ai fait fonctionner:
la source
dialog
ici etgetResources()
Vous pouvez le faire sans utiliser
AlertDialog
en définissant une nouvelle classe qui s'étend de laDialog
classe comme ceci:la source
Voici quelque chose que vous pouvez faire
AlertBuilder
pour faire disparaître le titre:la source
Utilisez ceci
la source
dialog_custom .requestWindowFeature (Window.FEATURE_NO_TITLE);
cela supprimera le titre de la boîte de dialogue de découpe.
Notez ajouter ces lignes avant d'ajouter du contenu .. par exemple
la source