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.
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 ().
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);
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.
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.
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.
vous pouvez supprimer le titre par
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
où dialogue est le nom de mon dialogue.
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.
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"
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
}
}
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.
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.
Définissez le titre sur chaîne vide à l'aide du générateur.
Builder builder = new AlertDialog.Builder(context);
builder.setTitle("");
...
builder.show();
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.
dialog=new Dialog(YourActivity.this, 1); // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);
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();
en XML utiliser un thème
Android:theme="@Android:style/Theme.NoTitleBar"
Pensez que vous pouvez simplement utiliser ceci maintenant:
AlertDialog dialog = new AlertDialog.Builder(this)
.setView(view)
.setTitle("")
.create()
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
"Loading. Please wait...", true);
crée un titre sans dialogue
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();
}
Lorsque vous utilisez AlertDialog, ne pas utiliser setTitle()
fait disparaître le titre
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);
}
}
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);
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);
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);
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)