web-dev-qa-db-fra.com

Comment changer la couleur d'arrière-plan de la boîte de dialogue par programme?

J'ai une activité principale où les utilisateurs peuvent changer (via les préférences) la couleur d'arrière-plan en leur couleur préférée. Mon problème est que je ne peux pas changer la couleur d'arrière-plan des boîtes de dialogue personnalisées.

D'autres réponses dans le débordement de pile suggèrent:

(a) remplaçant le thème par défaut à la couleur préférée. Je ne pense pas que ce soit une solution appropriée dans ce cas car je sais que changer de thème au moment de l'exécution n'est pas recommandé.

(b) Modification dans styles.xml (ne convient pas dans ce cas car je ne peux pas changer au moment de l'exécution)

(c) Substitution de la classe AlertBuilder (mais cela teinte toute la boîte de dialogue d'alerte)

Le plus proche que j'ai pu changer de couleur est de supprimer le titre du générateur d'alerte et de définir l'arrière-plan de la vue personnalisée sur la couleur préférée (par exemple, rose). Malheureusement, cela donne une bande moche en haut et en bas de la boîte de dialogue.

Le code est inclus après l'image, des suggestions sur la façon de changer l'arrière-plan de la boîte de dialogue seraient grandement appréciées.

Dialog appearance

Code pour l'apparence par défaut

protected Dialog onCreateDialog(int dialogId) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);


        final View viewMessEdit = inflater.inflate(R.layout.example,(ViewGroup) findViewById(R.id.dialog_mess_edit_root));
              builder.setView(viewMessEdit);
        builder.setTitle("Alert builder's title");
}

Code pour changer la couleur d'arrière-plan des vues de dialogue personnalisées (et le titre du générateur Alert est supprimé)

protected Dialog onCreateDialog(int dialogId) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);


        final View viewMessEdit = inflater.inflate(R.layout.example,(ViewGroup) findViewById(R.id.dialog_mess_edit_root));
              builder.setView(viewMessEdit);
              viewMessEdit.setBackgroundResource(R.color.pink_dark);

}
18
Mel

J'ai un peu fait face au même problème. Et la seule façon de le résoudre était d'étendre ma propre version de la mise en page. Je vois que dans votre cas, c'est un AlertDialog. Ce que je vous recommande de faire, c'est de créer une classe unique, qui est votre AlertDialog personnalisé et de créer une mise en page pour cela, puis vous gonflez cela.

Voici un article qui m'a beaucoup aidé. http://blog.androgames.net/10/custom-Android-dialog/

J'ai suivi ce post et résolu mon problème de personnalisation des boîtes de dialogue.

S'il vous plaît, si vous avez d'autres doutes, faites-le moi savoir.

Merci.

8
rogcg

J'ai trouvé une solution à une règle!

d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground);

Cela fonctionne pour moi avec un dialogue normal. Mais je ne sais pas si cela fonctionne sur un AlertDialog.

17
user3696814

Couleur d'arrière-plan du dialogue

dialog.getWindow().setBackgroundDrawableResource(R.color.glassblack);

vraiment bien fonctionné pour moi.

4
S HemaNandhini

J'ai trouvé un hack, sans créer de mise en page personnalisée, vous pouvez créer plusieurs designs en jouant avec certaines propriétés de AlertDialog.

Ce que vous devez faire:

Lorsque AlertDialog est visible sur votre écran, OnShowListener est appelé. Ainsi, en ajoutant dialog.setOnShowListener(this) vous pourrez personnaliser votre AlertDialog.

Code:

// Create AlertDialog
AlertDialog.Builder adb = new AlertDialog.Builder(context1);
    adb.setTitle(context1.getString(R.string.app_name))
    .setMessage(message)
    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {

        }
});
AlertDialog dialog = adb.create();

// Make some UI changes for AlertDialog
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(final DialogInterface dialog) {

        // Add or create your own background drawable for AlertDialog window
        Window view = ((AlertDialog)dialog).getWindow();
        view.setBackgroundDrawableResource(R.drawable.your_drawable);

        // Customize POSITIVE, NEGATIVE and NEUTRAL buttons.
        Button positiveButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_POSITIVE);
        positiveButton.setTextColor(context1.getResources().getColor(R.color.primaryColor));
        positiveButton.setTypeface(Typeface.DEFAULT_BOLD);
        positiveButton.invalidate();

        Button negativeButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEGATIVE);
        negativeButton.setTextColor(context1.getResources().getColor(R.color.primaryColor));
        negativeButton.setTypeface(Typeface.DEFAULT_BOLD);
        negativeButton.invalidate();

        Button neutralButton = ((AlertDialog)dialog).getButton(DialogInterface.BUTTON_NEUTRAL);
        neutralButton.setTextColor(context1.getResources().getColor(R.color.primaryColor));
        neutralButton.setTypeface(Typeface.DEFAULT_BOLD);
        neutralButton.invalidate();
    }
});
3
activesince93

La solution suggérée

d.getWindow().setBackgroundDrawableResource(R.drawable.menubackground);

Ne fonctionne pas bien (testé en 6.0) car il modifie l'ombre de la boîte de dialogue

Voici ma solution:

 public static void changeDialogBackground(final Dialog dialog,final int resId) {
    dialog.getWindow().getDecorView().setBackgroundResource(resId);
    dialog.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(final DialogInterface dialog) {
            Window window = ((AlertDialog)dialog).getWindow();
            window.getDecorView().setBackgroundResource(resId);
        }
    });
}
1
Gil SH