web-dev-qa-db-fra.com

Thème ne s'appliquant pas à DialogFragment sur Android

Je passe mes anciens dialogues à DialogFragment, mais les thèmes et les styles ne semblent pas fonctionner.

J'utilise DialogFragment de la bibliothèque de compatibilité v4, et dans la méthode onCreate, j'ai essayé d'appeler setStyle (style, thème); avec beaucoup de thèmes différents, mais la boîte de dialogue s'affiche toujours comme une "ancienne" boîte de dialogue dans l'émulateur exécutant Android 4.0.3 (c'est-à-dire qu'elle ne s'affiche pas dans le thème Holo).

Y a-t-il autre chose que je devrais faire? Est-ce que l'utilisation de la bibliothèque de compatibilité désactive le thème Holo ou quoi que ce soit? Si tel est le cas, dois-je créer deux DialogFragments, un pour les versions plus anciennes et un pour les versions plus récentes?

Merci!


Voici le code (simplifié) de ma boîte de dialogue. J'ai essayé Theme_Holo_Dialog_NoActionBar et Theme_DeviceDefault_Dialog_NoActionBar, mais l'émulateur Android 4 affiche toujours la boîte de dialogue comme une "ancienne" boîte de dialogue au lieu d'utiliser le thème Holo. Que fais-je de mal? :(

[...]
import Android.support.v4.app.DialogFragment;
[...]

public class AlertDialogFragment extends DialogFragment {

  public static AlertDialogFragment newInstance(int id) {

    AlertDialogFragment f = new AlertDialogFragment();
    Bundle args = new Bundle();
    args.putInt("id", id);
    f.setArguments(args);

 }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    int style = DialogFragment.STYLE_NORMAL, theme = 0;
    theme = Android.R.style.Theme_Holo_Dialog_NoActionBar;
    setStyle(style, theme);     
  }

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {

    mId = getArguments().getInt("id");
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
        .setTitle(mTitle)
        .setMessage(mMessage)
        .setPositiveButton(getString(R.string.btn_ok), new DialogInterface.OnClickListener() {      
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dismiss();                  
            }
        });
        return builder.create();
    }
43
LuTHieR

Je crois que vous devez définir le thème sur la boîte de dialogue réelle et non sur le fragment

Utilisez ce constructeur pour créer votre AlertDialog:

 AlertDialog.Builder(Context context, int theme)

c'est à dire

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), theme)
29
Blundell

Vous ne devez pas utiliser le constructeur AlertDialog.Builder (Context, int) avec la bibliothèque de support car il n'est disponible que depuis l'API 11.

Pour configurer un thème dans votre boîte de dialogue, utilisez plutôt un ContextThemeWrapper comme celui-ci:

ContextThemeWrapper context = new ContextThemeWrapper(getActivity(), Android.R.style.Theme_Holo_Dialog_NoActionBar);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
48
Florian

Je viens de perdre beaucoup de temps à cela, mais j'ai finalement trouvé un moyen de le faire entièrement en xml.

Dans un thème d'application, les boîtes de dialogue sont en fait thématiques séparément. Donc, pour styliser tous les DialogFragments avec des boutons verts et des conseils EditText verts, vous feriez un style comme celui-ci:

<style name="DialogTheme" parent="@Android:style/Theme.Holo.Light.Dialog">
    <item name="Android:buttonStyle">@style/button_green</item>
    <item name="Android:textColorHint">@color/green</item>
</style>

Ajoutez ensuite ce thème à votre thème d'application en tant que dialogTheme

<style name="MyTheme" parent="Android:Theme.Holo.Light">
    <item name="Android:dialogTheme">@style/DialogTheme</item>
</style>

Un grand merci à celui qui a écrit cet article pour m'avoir montré le chemin vers ce que je cherchais!

18
pumpkinpie65

Voici une réponse plus actuelle, en utilisant un SDK cible de 23 et un SDK min de 14, ce code fonctionne parfaitement pour moi.

La principale modification par rapport au code de la question consiste à définir le thème dans le constructeur, en remplaçant uniquement onCreateDialog() et en utilisant la classe AlertDialog de la bibliothèque de support v7.

En utilisant ce code, les boutons plats de texte vert (sans bordure) sont affichés sur 4.4.4 par opposition aux boutons gris par défaut avec des bordures.

import Android.support.v7.app.AlertDialog;
import Android.app.Dialog;
import Android.support.v4.app.DialogFragment;
import Android.content.DialogInterface;
import Android.os.Bundle;

public class MyDialog extends DialogFragment {

    String message;

    public MyDialog(String m) {
        message = m;
        int style = DialogFragment.STYLE_NORMAL, theme = 0;
        theme = Android.R.style.Theme_Holo_Dialog_NoActionBar;
        setStyle(style, theme);
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        return new AlertDialog.Builder(getActivity())
                .setMessage(message)
                .setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((EnterPhoneNumberActivity)getActivity()).doPositiveClick();
                        }
                    }
                )
                .setNegativeButton("EDIT",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((EnterPhoneNumberActivity)getActivity()).doNegativeClick();
                        }
                    }
                )
                .create();
    }
}

Utilisation dans une AppCompatActivity:

    String message = "test";
    if (message != null) {
        DialogFragment newFragment = new MyDialog(message);
        newFragment.show(getSupportFragmentManager(), "dialog");
    }
2
Daniel Nugent