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