Je me demandais si quelqu'un pouvait m'aider. J'essaie de créer un AlertDialog personnalisé. Pour ce faire, j'ai ajouté la ligne de code suivante dans styles.xml
<resources>
<style name="CustomAlertDialog" parent="android:Theme.Dialog.Alert">
<item name="android:windowBackground">@drawable/color_panel_background</item>
</style>
</resources>
- color_panel_background.9.png se trouve dans le dossier drawable. Ceci est également disponible dans le dossier res du SDK Android.
Voici l'activité principale.
package com.customdialog;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
public class CustomDialog extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setTheme(R.style.CustomAlertDialog);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("HELLO!");
builder .setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//MyActivity.this.finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//dialog.cancel();
}
});
AlertDialog alertdialog = builder.create();
alertdialog.show();
}
}
Afin d'appliquer le thème à un AlertDialog, j'ai dû mettre le thème dans le contexte actuel.
Cependant, je n'arrive pas à obtenir l'application pour afficher AlertDialog personnalisé. Quelqu'un peut-il m'aider avec ça?
Réponses:
Dans Dialog.java (Android src), un ContextThemeWrapper est utilisé. Vous pouvez donc copier l'idée et faire quelque chose comme:
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.AlertDialogCustom));
Et puis coiffez-le comme vous le souhaitez:
la source
@android:style/Theme.Dialog
public? Peut-il être utilisé à la place?Theme.AppCompat.Light.Dialog.Alert
style en tant que parent de votre style personnalisé. Mais si vous faites cela, assurez-vous que vous importezimport android.support.v7.app.AlertDialog;
et nonimport android.app.AlertDialog
J'avais ce
AlertDialog
problème lié au thème en utilisant sdk 1.6 comme décrit ici: http://markmail.org/message/mj5ut56irkrkc4nrJ'ai résolu le problème en procédant comme suit:
J'espère que cela t'aides.
la source
J'ai écrit un article dans mon blog sur la façon de configurer la disposition d'un AlertDialog avec des fichiers de style XML. Le problème principal est que vous avez besoin de différentes définitions de style pour différents paramètres de disposition. Voici un passe-partout basé sur le style AlertDialog de Holo Light Platform version 19 pour un fichier de style qui devrait couvrir un tas d'aspects de mise en page standard tels que les tailles de texte et les couleurs d'arrière-plan.
la source
la source
J'avais du mal avec cela - vous pouvez styliser l'arrière-plan de la boîte de dialogue à l'aide
android:alertDialogStyle="@style/AlertDialog"
de votre thème, mais il ignore tous les paramètres de texte que vous avez. Comme @rflexor l'a dit ci-dessus, cela ne peut pas être fait avec le SDK avant Honeycomb (vous pouvez bien l'utiliserReflection
).Ma solution, en un mot, a été de styliser l'arrière-plan de la boîte de dialogue à l'aide de ce qui précède, puis de définir un titre et une vue de contenu personnalisés (en utilisant des mises en page identiques à celles du SDK).
Mon emballage:
alert_dialog_title.xml (extrait du SDK)
alert_dialog_message.xml
Ensuite, utilisez simplement
CustomAlertDialogBuilder
au lieu deAlertDialog.Builder
pour créer vos boîtes de dialogue, puis appelezsetTitle
etsetMessage
comme d'habitude.la source
Vous pouvez attribuer directement un thème lorsque vous lancez le générateur:
Personnalisez ensuite votre thème dans votre
values/styles.xml
la source
Theme.AppCompat.Light.Dialog.Alert
Pour la boîte de dialogue personnalisée:
il suffit d'appeler
super(context,R.style.<dialog style>)
au lieu desuper(context)
dans le constructeur de dialoguePour AlertDialog:
Créez simplement alertDialog avec ce constructeur:
la source
Je suppose que cela ne peut pas être fait. Du moins pas avec le Builder. Je travaille avec 1.6 et l'implémentation dans Builder.create () est:
qui appelle le constructeur "not-theme-aware" de AlertDialog, qui ressemble à ceci:
Il existe un deuxième constructeur dans AlertDialog pour changer les thèmes:
que le Builder n'appelle tout simplement pas.
Si la boîte de dialogue est assez générique de toute façon, j'essaierais d'écrire une sous-classe d'AlertDialog, d'appeler le deuxième constructeur et d'utiliser cette classe à la place du mécanisme Builder.
la source
Un meilleur moyen de le faire est d'utiliser une boîte de dialogue personnalisée et de personnaliser selon vos besoins. Voici un exemple de boîte de dialogue personnalisée .....
}
Voici la disposition xml
la source
Quiconque essaie de le faire dans un fragment (en utilisant la bibliothèque de support, c'est-à-dire pré API 11) devrait aller avec ceci:
@Rflexor m'a donné le coup de pouce pour étendre AlertDialog et exposer le constructeur grâce
la source
AlertDialog.Builder(Context, int)
ne fonctionne que sur l'API 11 et au-dessus. Votre code se bloquera sur les versions antérieures d'Android.La solution d'Arve Waltin semble bonne, même si je ne l'ai pas encore testée. Il y a une autre solution dans le cas où vous avez du mal à obtenir que le travail .... Extend
AlertDialog.Builder
et passer outre toutes les méthodes (par exemple.setText
,setTitle
,setView
, Etc.) pour ne pas définir le véritable texte de dialogue / titre / vue, mais de créer une nouvelle vue à l' intérieur la vue de la boîte de dialogue fait tout là-dedans. Ensuite, vous êtes libre de tout coiffer à votre guise.Pour clarifier, en ce qui concerne la classe parente, la vue est définie, et rien d'autre.
En ce qui concerne votre classe étendue personnalisée, tout se fait dans cette vue.
la source
Je ne sais pas comment la solution d'Arve fonctionnerait dans une boîte de dialogue personnalisée avec un générateur où la vue est gonflée via un LayoutInflator.
La solution devrait être d'insérer le ContextThemeWrapper dans le gonfleur à travers
cloneInContext()
:la source
Cela peut être fait simplement en utilisant setView () du Builder. Vous pouvez créer n'importe quelle vue de votre choix et alimenter le générateur. Cela fonctionne bien. J'utilise un TextView personnalisé qui est rendu par le générateur de boîtes de dialogue. Je ne mets pas le message et cet espace est utilisé pour rendre ma vue textuelle personnalisée.
la source
la source