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 ??

Leem.fin
la source
Si vous nous montrez votre mise en page xml my_dialog, nous pouvons probablement vous aider à apporter des modifications.
Alan Moore
dupliquer? stackoverflow.com/questions/5469005/…
Samir Mangroliya
@ 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

Aleks G
la source
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

Ramesh Solanki
la source
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.

Md. Sajedul Karim
la source
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);
}
Wahib Ul Haq
la source
10

Nouveau BottomSheetDialog:

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

dialog.show();
Mohamed Murashid
la source
5

ajoutez simplement ceci à votre code:

dialog.getWindow().setGravity(Gravity.BOTTOM);
Techashonline
la source
1
dialog.getWindow().getAttributes().gravity = Gravity.BOTTOM;
Hossein Mansouri
la source
1

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

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.gravity = Gravity.BOTTOM;
Andris
la source
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;

}
Mue
la source
0

utiliser bottomSHeet:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);
dialog.setContentView(YourView);
dialog.show();
abbasalim
la source
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);
    }
}
NickUnuchek
la source