web-dev-qa-db-fra.com

Implémenter un menu contextuel avec marge

J'utilise le menu contextuel par défaut et j'attends le même comportement. Tout fonctionne bien. Ce qui me préoccupe, c'est le rendu du menu contextuel. Mon menu contextuel reste à droite de l'écran.

Je veux que le comportement utilisé par l'application Youtube pour Android . enter image description here

Je ne suis généralement pas en mesure de fournir la marge de droite à mon menu contextuel. Veuillez aider. J'ai essayé de fournir Gravity à PopUp Menu. Mais le menu contextuel reste à droite de l'écran.

PopupMenu popupMenu = new PopupMenu(mContext, anchor, Gravity.LEFT);
popupMenu.getMenuInflater().inflate(R.menu.menu_edit_accessory, popupMenu.getMenu());
16
Anchit Mittal

Vous pouvez modifier la position de votre PopupMenu en utilisant les attributs suivants: gravité, dropDownHorizontalOffset et dropDownVerticalOffset

Réglez d'abord la gravité sur Gravity.END

popup.setGravity(Gravity.END);

Modifiez ensuite vos listes déroulantes en créant un style

<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu">
    <item name="Android:dropDownHorizontalOffset">-4dp</item>
    <item name="Android:dropDownVerticalOffset">4dp</item>
</style>

Si vous souhaitez chevaucher la vue d'ancrage, utilisez

parent="@style/Widget.AppCompat.PopupMenu.Overflow"

Enfin, appliquez MyPopupMenu à votre thème

<item name="popupMenuStyle">@style/MyPopupMenu</item>
37
Markus Rubey

C'est un peu tard mais j'espère que cela aide quelqu'un.

J'essayais de faire ce que vous faisiez avec un PopupMenu mais rien ne fonctionnait pour moi jusqu'à ce que j'aie entendu parler de ListPopupWindow. C'est une bien meilleure alternative. Beaucoup plus flexible à mon avis et vous pouvez obtenir l'espacement des marges dont vous parliez.

Voici le code:

public class MainActivity extends AppCompatActivity
{
    private ImageButton mMoreOptionsButton;
    private ArrayAdapter<String> mPopupAdapter;
    private ArrayList<String> mOptionsArray = 
            new ArrayList<>(Arrays.asList("Option1", "Option2", "Option3"));
    private ListPopupWindow mPopupWindow;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mMoreOptionsButton = (ImageButton) view.findViewById(R.id.more_options_button);
        setupPopupWindow();
    }

    private void setupPopupWindow()
    {
        mPopupAdapter = new ArrayAdapter<>(MainActivity.this, Android.R.layout.simple_spinner_dropdown_item, mOptionsArray);
        mPopupWindow = new ListPopupWindow(MainActivity.this);
        mPopupWindow.setAdapter(mPopupAdapter);
        mPopupWindow.setAnchorView(mMoreOptionsButton);
        mPopupWindow.setWidth(500);
        mPopupWindow.setHorizontalOffset(-380); //<--this provides the margin you need
        //if you need a custom background color for the popup window, use this line:
        mPopupWindow.setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(MainActivity.this, R.color.gray)));

        mPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                //do something with item by referring to it using the "position" parameter
            }
        });

        mMoreOptionsButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                mPopupWindow.show();
            }
        });
    }
}

La partie clé appelle mPopupWindow.setHorizontalOffset(). Sachez que cette méthode est délicate. Selon la valeur que vous définissez dans mPopupWindow.setWidth(), vous devrez ajuster la valeur dans setHorizontalOffset() en conséquence. Il se trouve que pour mon application, -380 Était la quantité parfaite de marge dont j'avais besoin à la fin. Vous devrez donc peut-être jouer un peu avec cette valeur.

Je crois que la même chose peut être dite pour l'utilisation de setHeight() et setVerticalOffset() si vous voulez une marge en haut de votre fenêtre popup.

J'espère que cela t'aides :]

4
David Velasquez

Vous pouvez définir popUpWindow à un emplacement particulier

popupWindow .showAtLocation(popupView, Gravity.CENTER, 0, 0);

public void showAtLocation(View parent, int gravity, int x, int y) {
        showAtLocation(parent.getWindowToken(), gravity, x, y);
    }

Si vous souhaitez l'afficher en tant que DropDown, vous pouvez essayer

public void showAsDropDown(View anchor, int xoff, int yoff) {
        showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY);
    }

Jetez un oeil sur la documentation de PopupWindow http://developer.Android.com/intl/es/reference/Android/widget/PopupWindow.html

1
Anuj Sharma