Android: comment créer un dialogue Sans Titre?
j'essaie de générer un dialogue personnalisé sur 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 règle pas le titre du dialogue, le dialogue popup a un espace vide à la position du dialogue.
y a-t-il un moyen de cacher cette partie du dialogue?
j'ai essayé avec un AlertDialog mais il semble que la disposition n'est pas réglée correctement:
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 nul à la dernière ligne. La boîte de dialogue n'est pas nulle, donc le TextView j'essaie de récupérer n'existe pas.
Si je décommente la partie où j'utilise le constructeur de dialogue tout fonctionne bien sauf pour le titre au-dessus de ma disposition de dialogue.
24 réponses
vous pouvez cacher le titre d'une boîte de 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 ya une bonne explication sur le site du développeur Android sur dialogue personnalisé .
en très bref résumé, vous faites cela avec le code comme copié ci-dessous à partir du site officiel. Cela prend un fichier layot personnalisé, le gonfle, lui donne du texte de base et l'icône, puis le crée. Vous le montreriez 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 c'est le cas, alors vous devez changer juste un peu: au lieu de dialog.findView...
faire view.findView...
. Ensuite, une fois que vous avez fait cela, n'oubliez pas d'utiliser dialog.show(), ou même constructeur.show () sans prendre la peine de faire builder.créer.)(
FEATURE_NO_TITLE œuvres 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 il ne fonctionne pas lors de la création D'un AlertDialog (ou en utilisant le constructeur), parce qu'il désactive déjà le titre et utilise un personnalisé en interne.
j'ai regardé les sources SDK, et je pense que cela ne peut pas être travaillé autour. Donc, pour supprimer l'espacement supérieur, la seule solution est de créer un dialogue personnalisé à partir de zéro IMO, en utilisant la classe de dialogue directement.
Aussi, on peut le faire avec un style, par exemple, dans les styles.xml:
<style name="FullHeightDialog" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
</style>
et ensuite:
Dialog dialog = new Dialog(context, R.style.FullHeightDialog);
dans votre code ajouter 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 de code la barre de titre est créée puis supprimée ce qui est un gaspillage de ressources
OK bon essai mais ça ne marche pas. Je obtenir: Android.vue.WindowManager $ BadTokenException: Impossible d'ajouter la fenêtre -- token null est pas pour une demande si je veux shwo la boîte de dialogue.
changez la boîte de dialogue Type alerte en boîte de dialogue système (par exemple TYPE_SYSTEM_OVERLAY ) et voyez si cela résout votre problème
utiliser 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.
utiliser 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ù dialog est le nom de mon dialogue .
dans votre code si vous utilisez requestWindowFeature(Window.FEATURE_NO_TITLE);
assurez-vous qu'il va avant dialog.setContentView();
sinon il provoque l'application de planter.
j'ai trouvé Trois Façon de le faire >
1) utilisant 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) utilisant le thème XML dans AndroidManifest.xml
android:theme="@android:style/Theme.NoTitleBar"
dans votre Custom_Dialog.classe java ajouter 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 est la meilleure solution si la création d'une classe de dialogue personnalisé est la route que vous voulez prendre. Cependant, cela m'a dérangé que je ne pouvais pas utiliser le cours D'AlertDialog. Je voulais pouvoir utiliser le style par défaut du système AlertDialog. Créer une classe de dialogue personnalisée n'aurait pas ce style.
Donc j'ai trouvé une solution (hack) fonctionne sans avoir à créer une classe personnalisée, vous pouvez utiliser les constructeurs.
L'AlertDialog place une vue au-dessus de votre vue de contenu comme un espace réservé pour le titre. Si vous trouvez la vue et mettez la hauteur à 0, l'espace disparaît.
j'ai testé cela sur 2.3 et 3.0 jusqu'à présent, il est possible qu'il ne fonctionne pas sur toutes les versions encore.
Voici deux méthodes d'aide 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 utilisez ceci avec un fragment de dialogue, outrepassez la méthode onCreateDialog
du fragment de dialogue. Ensuite, Créez et retournez votre dialogue comme dans le premier exemple ci-dessus. Le seul changement est que vous devez passer false comme troisième paramètre (show) pour qu'il n'appelle pas show () dans la boîte de dialogue. Le DialogFragment s'en chargera plus tard.
exemple:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = new AlertDialog.Builder(getContext())
.setView(yourCustomView)
.create();
showDialogWithNoTopSpace(yourCustomView, dialog, false);
return dialog;
}
comme je le teste plus loin, je serai sûr de mettre à jour avec tous les ajustements supplémentaires nécessaires.
Je ne sais pas si cette question est toujours d'actualité, mais dans mon cas, quand je suis passé du dialogue au DialogFragment,
requestWindowFeature(Window.FEATURE_NO_TITLE);
n'était pas une option, mais je pouvais utiliser
setStyle(STYLE_NO_TITLE, 0);
à la place avec le même résultat.
définit le titre pour vider la chaîne en utilisant builder.
Builder builder = new AlertDialog.Builder(context);
builder.setTitle("");
...
builder.show();
définit l'attribut" gravity "sur l'ensemble de la boîte de dialogue À"center". Ensuite, vous devrez annuler ce paramètre pour tous les composants enfant dans la boîte de dialogue que vous ne voulez pas centré.
dialog=new Dialog(YourActivity.this, 1); // to make dialog box full screen with out title.
dialog.setContentView(layoutReference);
dialog.setContentView(R.layout.layoutexample);
en XML utiliser un thème
android:theme="@android:style/Theme.NoTitleBar"
si on utilise simplement le dialogue sans le setTitle()
, est-ce que ça va marcher pour enlever 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();
Pense que vous pouvez simplement utiliser ce maintenant:
AlertDialog dialog = new AlertDialog.Builder(this)
.setView(view)
.setTitle("")
.create()
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);
}
}
ProgressDialog dialog = ProgressDialog.show(MyActivity.this, "",
"Loading. Please wait...", true);
crée un dialogue Sans Titre
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();
}
en utilisant AlertDialog, sans utiliser setTitle()
fait disparaître le titre
après un tas de piratage, j'ai fait en sorte que ça marche:
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);
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);
utiliser cette
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);