7
votes

Comment puis-je changer la position de l'endroit où mon menu contextuel apparaît

J'ai un menu contextuel dans une adaptateur ListView pour chaque article. Le menu apparaît sur le bord gauche de l'écran, comment puis-je modifier cela pour être sur la droite

private void showPopupMenu(View v, final App app) {
    PopupMenu popupMenu = new PopupMenu(context, v);

    popupMenu.getMenuInflater().inflate(R.menu.quick_action_menu,
            popupMenu.getMenu());
    popupMenu
            .setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()) {
                    ...


0 commentaires

5 Réponses :


0
votes

vous ne pouvez pas. comme Docs disent :

Un popupmenu affiche un menu dans une fenêtre contextuelle modale ancrée à un Voir. La popup apparaîtra sous la vue d'ancrage s'il y a de la place ou au-dessus de ce qu'il n'y ait pas. Si l'IME est visible, la popup ne sera pas chevaucher jusqu'à ce qu'il soit touché. Toucher à l'extérieur de la popup rejeter-le.

Vous voudrez peut-être essayer d'utiliser popupwindow peut-être, ce qui permet ce positionnement.


3 commentaires

Juste une petite addition: utilisez une popupwindow et définissez la position souhaitée à l'aide de la présentation de la présentation (vue parent, int gravity, int x, int.


En effet, ce n'était pas clair pourquoi j'ai suggéré une fenêtre pop up. Mise à jour, merci.


Cela a du sens, mais il contredit le fait que vous pouvez définir une gravité (SetGrovity (int)) qui ne fait aucun effet



0
votes

Vous pouvez utiliser ListPopupWindow pour le menu contextuel de la liste Afficher la liste. Il existe des fonctions pour définir des décalages ( listpopupwindow ).

ou vous pouvez définir des décalages pour votre popupwindow explicitement à l'aide de cette fonction


0 commentaires

14
votes

meilleur en retard qu'une fois =) C'est ma décision, vous permet de définir PopupMenu sur les coordonnées spécifiées. Le code n'est pas très bon mais cela fonctionne.

public void show(Activity activity, float x, float y)
{
    final ViewGroup root = (ViewGroup) activity.getWindow().getDecorView().findViewById(android.R.id.content);

    final View view = new View(context);
    view.setLayoutParams(new ViewGroup.LayoutParams(1, 1));
    view.setBackgroundColor(Color.TRANSPARENT);

    root.addView(view);

    view.setX(x);
    view.setY(y);

    PopupMenu popupMenu = new PopupMenu(context, view, Gravity.CENTER);

    popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener()
    {
        @Override
        public void onDismiss(PopupMenu menu)
        {
            root.removeView(view);
        }
    });

    popupMenu.show();
}


1 commentaires

Solution parfaite pour montrer une popup sur les coordonnées absolues!



9
votes

Vous pouvez modifier la position de votre popupmenu en utilisant les attributs suivants: gravité forte>, dropdownhorizontalOffset strong> et DropdowstOverticalOffset strong>

première gravité de gravité.end p>

<item name="popupMenuStyle">@style/MyPopupMenu</item>


3 commentaires

popup.setgravity () nécessite le niveau d'API 23


Assurez-vous que vous utilisez une bibliothèque de support Android compatible en arrière et après l'importation Androidx.appcompat.Widget.PopupMenu;


Cela a fonctionné pour moi.



2
votes

Vous pouvez utiliser popupwindow à la place. Vous avez de nombreuses options pour positionnement:

  • popupwindow.showasdropdown (vue parent) affichera ci-dessous la vue parent
  • popupwindow.showasdropdown (vue anchor, int xoff, int yoff) montrera ci-dessous la vue parent mais applique également le décalage
  • popupwindow.showasdropdown (vue d'ancrage, int xoff, int yoff, int gravity) comme avant mais aussi la gravité
  • popupwindow.showatlocation (vue parent, int gravity, int x, int y) popup à toute position absolue

0 commentaires