1
votes

comment changer la marge entre les éléments dans le menu contextuel

Je veux changer l'espace entre les éléments dans mon menu contextuel sur Android

L'espace que je veux dire est celui-ci: entrez la description de l'image ici

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));
            }
        }


0 commentaires

3 Réponses :


2
votes

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>


1 commentaires

ce n'est pas un spinner ... j'ai ajouté le code pour le rendre clair



3
votes

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 .


2 commentaires

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.



0
votes

Vous pouvez créer une mise en page pour le menu contextuel et l'initialiser dans votre activité comme suit XML

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);

INITIALISEZ-LE COMME

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

// 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!


0 commentaires