web-dev-qa-db-fra.com

Android position du menu contextuel

J'essaie de créer une application Android où cliquer sur un bouton soulève un popupmenu. Le popupmenu est en cours de génération mais pas à la bonne position. Le code est comme suit:

menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">
<group Android:checkableBehavior="single">
<item
    Android:id="@+id/genderMale"
    Android:title="Male"
/>
<item
    Android:id="@+id/genderFemale"
    Android:title="Female"
/>
</group>
</menu>

La fonction pour exécuter le popup est la suivante:

public void showGenderPopup(View v)
{
    PopupMenu popup = new PopupMenu(this, v);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.gender_popup, popup.getMenu());
    popup.show();
}

Ici, le popupmenu est créé juste en dessous du textview lorsque je clique dessus. Je veux qu'il soit généré au centre de l'écran.

Comment s'y prendre?

12

Comme le dit la documentation:

Un menu contextuel affiche un menu dans une fenêtre contextuelle modale ancrée à une vue. La fenêtre contextuelle apparaîtra sous la vue d'ancrage s'il y a de la place, ou au-dessus s'il n'y en a pas. Si l'IME est visible, le popup ne le chevauchera pas tant qu'il n'est pas touché. Toucher en dehors de la fenêtre contextuelle la fermera.

Comme je peux le deviner, ce "View v"

public void showGenderPopup(View v)

est le TextView sur lequel vous cliquez, qui est lié à la méthode lorsque vous cliquez dessus, ce qui signifie que le PopupMenu apparaîtra juste en dessous du TextView.

Souhaitez-vous pas atteindre votre objectif avec un dialogue? Pour un AlertDialog personnalisé, il vous suffit d'utiliser la méthode

setView(View v)

du AlertDialog.Builder, avant de créer le dialogue lui-même.

Pour votre vue personnalisée, vous suivez deux méthodes:

XML: créez votre fichier de disposition XML, puis utilisez un gonfleur pour appliquer la disposition XML sur un objet View customView. (le fichier de mise en page est appelé customDialog.xml à titre d'exemple)

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

View customView = inflater.inflate(R.layout.customDialog, null);    

RadioButton radioButton = (RadioButton) customView.findViewById(R.id.customDialogRadioButton);
radioButton.setOnClickListener(new OnClickListener() { .. });

DYNAMIQUEMENT:

Je vais utiliser LinearLayout comme exemple.

LinearLayout customView = new LinearLayout(context);

RadioButton radioBtn = new RadioButton(context); 
radioBtn.setOnClickListener(new OnClickListener() { .. });

customView.addView(radioBtn);

Pour créer la boîte de dialogue, vous utilisez ensuite ce code

AlertDialog.Builder b = new AlertDialog.Builder(context);
b.setMessage("Example");

// set dialog's parameters from the builder

b.setView(customView);

Dialog d = b.create();
d.show();
4
FrancescoC
  PopupMenu popup = new PopupMenu(this, v,Gravity.CENTER);  

utilisez le code ci-dessus. La gravité a de nombreuses options comme centre/gauche/droite vérifier la documentation ocne

22
RamBabu Pudari