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 .
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());
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>
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 :]
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