Comment changer le thème pour AlertDialog

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

  @drawable/color_panel_background   
  • color_panel_background.9.png est situé dans le dossier pouvant être dessiné. Ceci est également disponible dans le dossier res de SDK Android.

L’activité principale est la suivante.

 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(); } } 

Pour appliquer le thème à un AlertDialog, j’ai dû définir le thème dans le contexte actuel.

Cependant, je n’arrive pas à obtenir l’application pour afficher AlertDialog personnalisé. Est-ce que quelqu’un pourrait m’aider avec ceci?

    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 le style comme tu veux:

         

    J’avais ce problème lié au thème AlertDialog en utilisant sdk 1.6 comme décrit ici: http://markmail.org/message/mj5ut56irkrkc4nr

    J’ai résolu le problème en procédant comme suit:

      new AlertDialog.Builder( new ContextThemeWrapper(context, android.R.style.Theme_Dialog)) 

    J’espère que cela t’aides.

    J’ai écrit un article sur mon blog sur la configuration de la disposition d’un AlertDialog avec des fichiers de style XML. Le principal problème est que vous avez besoin de définitions de style différentes pour différents parameters de mise en page. Voici un modèle basé sur le style AlertDialog de Holo Light Platform version 19 pour un fichier de style qui devrait couvrir un ensemble d’aspects de mise en page standard tels que les tailles de texte et les couleurs d’arrière-plan.

            

    Je me débattais avec ceci – vous pouvez android:alertDialogStyle="@style/AlertDialog" l’arrière-plan de la boîte de dialog en utilisant android:alertDialogStyle="@style/AlertDialog" dans votre thème, mais il ignore les parameters de texte que vous avez. Comme @rflexor l’a dit plus haut, cela ne peut pas être fait avec le SDK avant Honeycomb (vous pouvez utiliser Reflection ).

    En résumé, ma solution consistait à définir l’arrière-plan de la boîte de dialog à l’aide de ce qui précède, puis à définir un titre et une vue de contenu personnalisés (utilisant des dispositions identiques à celles du SDK).

    Mon emballage:

     import com.mypackage.R; import android.app.AlertDialog; import android.content.Context; import android.graphics.drawable.Drawable; import android.view.View; import android.widget.ImageView; import android.widget.TextView; public class CustomAlertDialogBuilder extends AlertDialog.Builder { private final Context mContext; private TextView mTitle; private ImageView mIcon; private TextView mMessage; public CustomAlertDialogBuilder(Context context) { super(context); mContext = context; View customTitle = View.inflate(mContext, R.layout.alert_dialog_title, null); mTitle = (TextView) customTitle.findViewById(R.id.alertTitle); mIcon = (ImageView) customTitle.findViewById(R.id.icon); setCustomTitle(customTitle); View customMessage = View.inflate(mContext, R.layout.alert_dialog_message, null); mMessage = (TextView) customMessage.findViewById(R.id.message); setView(customMessage); } @Override public CustomAlertDialogBuilder setTitle(int textResId) { mTitle.setText(textResId); return this; } @Override public CustomAlertDialogBuilder setTitle(CharSequence text) { mTitle.setText(text); return this; } @Override public CustomAlertDialogBuilder setMessage(int textResId) { mMessage.setText(textResId); return this; } @Override public CustomAlertDialogBuilder setMessage(CharSequence text) { mMessage.setText(text); return this; } @Override public CustomAlertDialogBuilder setIcon(int drawableResId) { mIcon.setImageResource(drawableResId); return this; } @Override public CustomAlertDialogBuilder setIcon(Drawable icon) { mIcon.setImageDrawable(icon); return this; } } 

    alert_dialog_title.xml (extrait du SDK)

             

    alert_dialog_message.xml

         

    Utilisez simplement CustomAlertDialogBuilder au lieu de AlertDialog.Builder pour créer vos boîtes de dialog, et appelez simplement setTitle et setMessage comme d’habitude.

       new AlertDialog.Builder(new ContextThemeWrapper(context,R.style.AlertDialogCustom)) .setMessage(Html.fromHtml(Msg)) .setPositiveButton(posBtn, okListener) .setNegativeButton(negBtn, null) .create() .show(); 

    Vous pouvez directement atsortingbuer un thème lorsque vous lancez le générateur:

     AlertDialog.Builder builder = new AlertDialog.Builder( getActivity(), R.style.MyAlertDialogTheme); 

    Ensuite, personnalisez votre thème dans vos values/styles.xml

       

    Je suppose que cela ne peut pas être fait. Au moins pas avec le constructeur. Je travaille avec 1.6 et l’implémentation dans Builder.create () est:

     public AlertDialog create() { final AlertDialog dialog = new AlertDialog(P.mContext); P.apply(dialog.mAlert); [...] } 

    qui appelle le constructeur “not-theme-aware” de AlertDialog, qui ressemble à ceci:

     protected AlertDialog(Context context) { this(context, com.android.internal.R.style.Theme_Dialog_Alert); } 

    Il y a un deuxième constructeur dans AlertDialog pour changer les thèmes:

     protected AlertDialog(Context context, int theme) { super(context, theme); [...] } 

    que le constructeur n’appelle pas.

    Si le dialog est assez générique, j’essaierais d’écrire une sous-classe de AlertDialog, en appelant le deuxième constructeur et en utilisant cette classe à la place du mécanisme Builder.

    Une meilleure façon d’utiliser cette boîte de dialog personnalisée et de personnaliser selon vos besoins est l’exemple de dialog personnalisé …..

    entrer la description de l'image ici

     public class CustomDialogUI { Dialog dialog; Vibrator vib; RelativeLayout rl; @SuppressWarnings("static-access") public void dialog(final Context context, Ssortingng title, Ssortingng message, final Runnable task) { dialog = new Dialog(context); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.custom); dialog.setCancelable(false); TextView m = (TextView) dialog.findViewById(R.id.message); TextView t = (TextView) dialog.findViewById(R.id.title); final Button n = (Button) dialog.findViewById(R.id.button2); final Button p = (Button) dialog.findViewById(R.id.next_button); rl = (RelativeLayout) dialog.findViewById(R.id.rlmain); t.setText(bold(title)); m.setText(message); dialog.show(); n.setText(bold("Close")); p.setText(bold("Ok")); // color(context,rl); vib = (Vibrator) context.getSystemService(context.VIBRATOR_SERVICE); n.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { vib.vibrate(15); dialog.dismiss(); } }); p.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { vib.vibrate(20); dialog.dismiss(); task.run(); } }); } //customize text style bold italic.... public SpannableSsortingng bold(Ssortingng s) { SpannableSsortingng spanSsortingng = new SpannableSsortingng(s); spanSsortingng.setSpan(new StyleSpan(Typeface.BOLD), 0, spanSsortingng.length(), 0); spanSsortingng.setSpan(new UnderlineSpan(), 0, spanSsortingng.length(), 0); // spanSsortingng.setSpan(new StyleSpan(Typeface.ITALIC), 0, // spanSsortingng.length(), 0); return spanSsortingng; } 

    }

    Voici la disposition de xml

                    

    Toute personne essayant de faire cela dans un fragment (en utilisant la bibliothèque de support, c.-à-d. Pré API 11) devrait aller avec ceci:

     public class LoadingDialogFragment extends DialogFragment { public static final Ssortingng ID = "loadingDialog"; public static LoadingDialogFragment newInstance() { LoadingDialogFragment f = new LoadingDialogFragment(); return f; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { StyleAlertDialog adb = new StyleAlertDialog(getActivity(), R.style.Your_Style); adb.setView(getActivity().getLayoutInflater().inflate(R.layout.fragment_dialog_layout, null)); return adb; } private class StyleAlertDialog extends AlertDialog { protected StyleAlertDialog(Context context, int theme) { super(context, theme); } } } 

    @Rflexor m’a donné le coup de pouce pour étendre AlertDialog et exposer le constructeur grâce

    La solution d’Arve Waltin semble bonne, même si je ne l’ai pas encore testée. Il y a une autre solution au cas où vous auriez du mal à faire fonctionner cela … Étendez AlertDialog.Builder et remplacez toutes les méthodes (par exemple, setTitle , setView , setView , etc.) pour ne pas définir le texte / titre / vue du dialog, mais pour créer une nouvelle vue dans la vue du dialog, faites tout ce qui est dans cette fenêtre. 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 est fait dans cette vue.

    Pour un dialog personnalisé:

    appelez simplement super(context,R.style.

    ) au lieu de super(context) dans le constructeur de dialog

     public class MyDialog extends Dialog { public MyDialog(Context context) { super(context, R.style.Theme_AppCompat_Light_Dialog_Alert) } } 

    Pour AlertDialog:

    Il suffit de créer alertDialog avec ce constructeur:

      new AlertDialog.Builder( new ContextThemeWrapper(context, android.R.style.Theme_Dialog)) 

    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é rendu par le générateur de boîte de dialog. Je ne mets pas le message et cet espace est utilisé pour rendre mon textview custome.

     AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Title"); builder.setMessage("Description"); builder.setPositiveButton("OK", null); builder.setNegativeButton("Cancel", null); builder.show();