Android弹出菜单位置

时间:2015-01-22 13:22:15

标签: android popupmenu

我正在尝试创建一个Android应用程序,单击按钮会引发popupmenupopupmenu正在生成,但不在正确的位置。代码如下:

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>

执行弹出窗口的功能如下:

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下方创建{{1}}。我想让它在屏幕的中心生成。

如何去做?

2 个答案:

答案 0 :(得分:22)

  PopupMenu popup = new PopupMenu(this, v,Gravity.CENTER);  

使用上面的代码。重力有许多选项,如中心/左/右检查文档ocne

答案 1 :(得分:3)

正如文档所说:

  

PopupMenu在固定到视图的模态弹出窗口中显示菜单。如果有空间,弹出窗口将显示在锚点视图下方,如果没有空间,则弹出窗口将显示在锚点视图下方。如果IME可见,弹出窗口将不会重叠,直到触摸它为止。触摸弹出窗口将会解雇它。

正如我猜测的那样,“观看v”

public void showGenderPopup(View v)

是您单击的TextView,它在单击时绑定到该方法,这意味着PopupMenu将显示在TextView的正下方。

你不是用Dialog实现目标吗?对于自定义AlertDialog,您只需使用方法

setView(View v)
在创建Dialog本身之前,AlertDialog.Builder的

对于自定义视图,您可以采用以下两种方式:

XML: 创建XML布局文件,然后使用inflater通过View customView对象应用XML布局。 (布局文件称为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();