Je veux changer l'espace entre les éléments dans mon menu contextuel sur Android
L'espace que je veux dire est celui-ci:
J'espère qu'il y a une solution directe, mais comme je sais Android, ce ne sera pas si simple
de toute façon je voudrais également pour définir le maxHeight
de ma fenêtre contextuelle ...
Dans ce cas, le popup est acheminé par le TextView "Sélectionnez le prix" afin qu'il remplisse l'espace au-dessus, mais tous les éléments ne rentrent pas dans cet espace, donc Android crée automatiquement une vue de défilement (à la verticale)
le fait est que je sais que 100% des utilisateurs n'utiliseront pas ce parchemin, donc les éléments de mon menu sous "Voyage" ne seront jamais vus.
Comment puis-je régler la hauteur afin de faire suffisamment d'espace pour tous les éléments ?
============= UPDATE ================
Juste pour clarifier les choses , ce n'est pas un spinner, c'est un menu contextuel
this.popupCategories = new PopupMenu(this, this.categoryLabel); for (Giveaway.GiveawayCategoryGroup catGroup : categoryGroups) { SubMenu submenu = this.popupCategories.getMenu().addSubMenu(catGroup.getDescription(lang)); for (Giveaway.GiveawayCategory cat : (Collection<? extends Giveaway.GiveawayCategory>) catGroup.getCategories()) { if (cat.isActive()) submenu.add(Menu.NONE, cat.getValue().hashCode(), (int) cat.getOrder(), cat.getDescription(lang)); } }
3 Réponses :
Les éléments
PopupMenu
ne sont que des éléments MenuItem
normaux; c'est le même attribut, mais un autre style parent:
MenuItem item = menu.findItem(R.id.itemMenu); MenuItemCompat.setActionView(item, R.layout.layout_menu);
cela n'affecte que le PopupMenu
auquel le style a été attribué.
aussi là, on pourrait définir un ActionView
personnalisé (par élément individuel, pas comme modèle):
<style name="customPopupMenuStyle" parent="@android:style/Widget.PopupMenu"> <item name="android:listPreferredItemHeightSmall">32dp</item> </style>
ce n'est pas un spinner ... j'ai ajouté le code pour le rendre clair
Vous devez définir la hauteur de votre ligne d'élément préférée dans votre AppTheme dans styles.xml
:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="android:listPreferredItemHeightSmall">20dp</item> </style>
Vous devrez peut-être modifier un peu ce nombre pour obtenir le valeur correcte, mais il détermine la hauteur de ces lignes. Assurez-vous de remplacer Theme.AppCompat.Light.DarkActionBar
par ce que vous utilisez actuellement.
En ce qui concerne la définition d'une hauteur maximale, j'ai bien peur que vous deviez créer votre propre classe d'extension pour cela, comme dans cet exemple .
une question supplémentaire: quand traiter ces styles Android standard ... comment puis-je savoir lequel remplacer sans en essayer beaucoup? (Je savais qu'il y avait un style pour ça mais je ne savais pas lequel)
Malheureusement, la réponse est de le rechercher sur Google ou de rechercher un débordement de pile. Les réponses peuvent être trouvées dans la documentation, mais il est généralement assez difficile de se trouver.
Vous pouvez créer une mise en page pour le menu contextuel et l'initialiser dans votre activité comme suit
XML INITIALISEZ-LE COMME // affichera une fenêtre contextuelle dans le coin supérieur gauche de l'écran de la vue d'activité, vous pouvez essayer quelques itérations pour qu'elle montre où à l'écran en fonction de vos besoins J'espère que cela vous aidera! View parentv = findViewById(R.id.activityview); //id of parent view of activity in which popup will be shown
LayoutInflater layoutInflater
= (LayoutInflater) getBaseContext()
.getSystemService(LAYOUT_INFLATER_SERVICE);
View popupView = layoutInflater.inflate(R.layout.YOURPOPUPMENU, null);
final PopupWindow popupWindow = new PopupWindow(
popupView,
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.MATCH_PARENT);
TextView tv = popupView.findViewById(R.id.textviewid); //to do something with textview
tv.setText("Fashion");
popupWindow.setOutsideTouchable(true); //if you want to dismiss popup if clicked outside
popupWindow.setFocusable(true);
// Removes default background.
popupWindow.setBackgroundDrawable(new android.graphics.drawable.ColorDrawable(android.graphics.Color.TRANSPARENT));
// popupWindow.setAnimationStyle(R.style.righttoleftstyle); can put animation to slide in popupmenu by defining any animation
popupWindow.showAtLocation(parentv, Gravity.START | Gravity.TOP,0,0);
> <?xml version="1.0" encoding="utf-8"?> <LinearLayout
> xmlns:android="http://schemas.android.com/apk/res/android"
> android:layout_width="match_parent"
> android:layout_height="match_parent"
> android:gravity="center"
> android:background="@android:color/transparent">
> <LinearLayout
> android:layout_width="wrap_content"
> android:layout_height="YOUR MAX HEIGHT"
> android:gravity="center"
> android:weightsum="YOUR NUMBER OF ITEMS"
> android:orientation="vertical"
> android:layout_gravity="center"
> >
> <TextView
> android:layout_width="wrap_content"
> android:layout_height="0dp"
> android:weight="1" /> ...no of views items
> </LinearLayout> </LinearLayout>