Android popupmenu позиция

Я пытаюсь сделать приложение для Android, где нажатие кнопки вызывает popupmenu. The popupmenu создается, но не в правильном положении. Код выглядит следующим образом:

.в 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>

функция для выполнения всплывающего окна выглядит следующим образом:

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();
}
на popupmenu создается чуть ниже textview когда я нажимаю на него. Я хочу, чтобы он был сгенерирован в центре экрана.

как это?

2 ответов


как из docs говорит:

A PopupMenu отображает меню в модальном всплывающем окне, привязанном к представлению. Всплывающее окно появится под видом якоря, если есть место, или над ним, если его нет. Если IME виден, всплывающее окно не будет перекрывать его, пока оно не будет затронуто. Прикосновение вне всплывающего окна будет отклонять его.

как я могу догадаться, что "View v"

public void showGenderPopup(View v)

- Это TextView, который вы нажимаете, который привязан к методу, когда он Нажмите, что означает, что PopupMenu будет отображаться прямо под TextView.

разве вы не достигли бы своей цели с помощью диалога? Для пользовательского AlertDialog вам просто нужно использовать метод

setView(View v)

в AlertDialog.Builder, перед созданием самого диалога.

для вашего пользовательского представления вы либо выполните два способа:

XML-файле: Создайте файл макета XML, а затем с помощью инфлятора примените макет XML к объекту представления customView. (файл макета называется customDialog.xml в качестве примера)

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() { .. });

динамически :

Я буду использовать LinearLayout в качестве примера.

LinearLayout customView = new LinearLayout(context);

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

customView.addView(radioBtn);

чтобы создать диалоговое окно, вы затем используете этот код

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

используйте код выше. Гравитация имеет много вариантов, таких как center/left/right проверьте документацию ocne