Changement de la position de la boîte de dialogue à l'écran Android


111

J'ai fait un simple AlertDialogdans mon activité :

View view = layoutInflater.inflate(R.layout.my_dialog, null);
AlertDialog infoDialog = new AlertDialog.Builder(MyActivity.this)
                    .setView(view)  
                    .create();

infoDialog.show();

Avec le code ci-dessus, la boîte de dialogue s'affiche au centre (environ) de l'écran.

Je me demande, comment puis-je personnaliser la position de la boîte de dialogue pour qu'elle s'affiche juste sous la barre d'action supérieure? (Est-il possible de changer la gravité ou quelque chose du dialogue?) Et comment le faire en fonction de mon code ??


Si vous nous montrez votre mise en page xml my_dialog, nous pouvons probablement vous aider à apporter des modifications.
Alan Moore


@ Ankit, pouvez-vous mettre votre commentaire en réponse, car mon problème sera résolu après avoir vérifié votre lien.
Leem.fin

Réponses:


235

J'ai utilisé ce code pour afficher la boîte de dialogue en bas de l'écran:

Dialog dlg = <code to create custom dialog>;

Window window = dlg.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();

wlp.gravity = Gravity.BOTTOM;
wlp.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
window.setAttributes(wlp);

Ce code empêche également Android d'atténuer l'arrière-plan de la boîte de dialogue, si vous en avez besoin. Vous devriez pouvoir modifier le paramètre de gravité pour déplacer la boîte de dialogue


Bonjour merci. J'ai mis sa gravité en haut, la boîte de dialogue va en haut de l'écran, mais elle a également couvert ma barre d'action, je voudrais la boîte de dialogue en haut mais juste sous la barre d'action ... comment régler cela?
Leem.fin

6
Vous pouvez essayer d'utiliser les champs wlp.xet wlp.ypour définir explicitement l'emplacement de la boîte de dialogue à l'écran. Je ne l'ai pas essayé moi-même, mais cela devrait probablement fonctionner.
Aleks G

4
La compensation de la gradation n'a pas fonctionné pour moi (bien que le reste ait fonctionné comme un charme). J'ai trouvé une solution à la gradation à un autre endroit, sous la forme de: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck

@AleksG existe-t-il un moyen de changer également la couleur du fond sombre en gardant le journal au centre? J'ai essayé de définir windowIsFloating = false sur le style du journal. Mais il aligne le journal en haut!
Kshitij

@Kshitij Si vous voulez garder le dialogue au centre, vous n'avez besoin d'aucun de ce code - les dialogues des centres Android par défaut. Quant au changement de la couleur sombre, cela est contrôlé par le thème. Vous pourrez peut-être le remplacer en incluant le thème correspondant dans votre application. Je n'ai cependant jamais essayé.
Aleks G

23
private void showPictureialog() {
    final Dialog dialog = new Dialog(this,
            android.R.style.Theme_Translucent_NoTitleBar);

    // Setting dialogview
    Window window = dialog.getWindow();
    window.setGravity(Gravity.CENTER);

    window.setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    dialog.setTitle(null);
    dialog.setContentView(R.layout.selectpic_dialog);
    dialog.setCancelable(true);

    dialog.show();
}

vous pouvez personnaliser votre boîte de dialogue en fonction de la gravité et des paramètres de disposition, changer la gravité et les paramètres de disposition en fonction de vos besoins


1
Bonjour merci. J'ai mis sa gravité en haut, la boîte de dialogue va en haut de l'écran, mais elle a également couvert ma barre d'action, je voudrais la boîte de dialogue en haut mais juste sous la barre d'action ... comment régler cela?
Leem.fin

3
vous pouvez définir la marge en haut de la mise en page
Ramesh Solanki

'FILL_PARENT'est obsolète. Je suis sur l'API 21. Comme par Developer Reference
fWd82

1
@ fWd82 alors utilisez plutôt 'MATCH_PARENT'
William

13

J'ai trouvé cet extrait de code du code @gypsicoder ici

private CharSequence[] items = {"Set as Ringtone", "Set as Alarm"};
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setItems(items, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int item) {

        if(item == 0) {

        } else if(item == 1) {

        } else if(item == 2) {

        }
    }
});

AlertDialog dialog = builder.create();
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
WindowManager.LayoutParams wmlp = dialog.getWindow().getAttributes();

wmlp.gravity = Gravity.TOP | Gravity.LEFT;
wmlp.x = 100;   //x position
wmlp.y = 100;   //y position

dialog.show();

Ici, la valeur de la position x correspond aux pixels de gauche à droite. Pour la position y, la valeur est de bas en haut.


10

Pour moi, cela a plutôt bien fonctionné là où j'essayais de positionner ma boîte de dialogue quelque part exactement au bas de la vue de texte où elle est sélectionnée.

public void setPosition(int yValue) {
    Window window = getWindow();
    WindowManager.LayoutParams param = window.getAttributes();
    param.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
    param.y = yValue;
    window.setAttributes(param);
    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}

10

Nouveau BottomSheetDialog:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);    
dialog.setContentView(YourView);

dialog.show();

5

ajoutez simplement ceci à votre code:

dialog.getWindow().setGravity(Gravity.BOTTOM);


1

Pour mon activité Dialog, j'ai utilisé celui-ci:

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.gravity = Gravity.BOTTOM;

1

j'utilise cette méthode

 @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    Window window = dialog.getWindow();
    WindowManager.LayoutParams wlp = window.getAttributes();
    wlp.gravity = Gravity.BOTTOM;
    dialog.setContentView(R.layout.dialog_droppoint);
    dialog.show();
    window.setAttributes(wlp);
    return dialog;

}

0

utiliser bottomSHeet:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);
dialog.setContentView(YourView);
dialog.show();

0
public class MyDialogFragment extends DialogFragment{
    protected void setDialogGravity(int gravity) {
        Dialog dialog = getDialog();
        if (dialog != null) {
            Window window = dialog.getWindow();
            if (window != null) {
                WindowManager.LayoutParams params = window.getAttributes();
                params.width = WindowManager.LayoutParams.MATCH_PARENT;
                params.height = WindowManager.LayoutParams.MATCH_PARENT;
                params.horizontalMargin = 0;
                params.gravity = gravity;
                params.dimAmount = 0;
                params.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
                window.setAttributes(params);
            }
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater,container,savedInstanceState);

        return inflater.inflate(R.layout.my_dialog, null);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
                super.onViewCreated(view, savedInstanceState);
                setDialogGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.