我正在使用默认的弹出菜单,并期望相同的行为。一切都很好。我关注的是弹出菜单的渲染。我的弹出菜单显示在屏幕右侧。
我主要无法为弹出菜单提供正确的保证金。请帮忙。我尝试过为PopUp菜单提供Gravity。但弹出菜单粘在屏幕右侧。
PopupMenu popupMenu = new PopupMenu(mContext, anchor, Gravity.LEFT);
popupMenu.getMenuInflater().inflate(R.menu.menu_edit_accessory, popupMenu.getMenu());
您可以使用以下属性更改PopupMenu的位置:gravity,dropDownHorizontalOffset和dropDownVerticalOffset
首先将重力设置为Gravity.END
popup.setGravity(Gravity.END);
然后通过创建样式来更改下拉列表偏移
<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu">
<item name="android:dropDownHorizontalOffset">-4dp</item>
<item name="android:dropDownVerticalOffset">4dp</item>
</style>
如果要重叠锚视图使用
parent="@style/Widget.AppCompat.PopupMenu.Overflow"
最后将MyPopupMenu应用于您的主题
<item name="popupMenuStyle">@style/MyPopupMenu</item>
这有点晚了,但我希望这有助于某人。
我试着用PopupMenu
做你正在做的事情,但在我了解ListPopupWindow
之前,没有什么对我有用。这是一种更好的选择。在我看来更加灵活,你可以实现你所询问的边距。
这是代码:
public class MainActivity extends AppCompatActivity
{
private ImageButton mMoreOptionsButton;
private ArrayAdapter<String> mPopupAdapter;
private ArrayList<String> mOptionsArray =
new ArrayList<>(Arrays.asList("Option1", "Option2", "Option3"));
private ListPopupWindow mPopupWindow;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMoreOptionsButton = (ImageButton) view.findViewById(R.id.more_options_button);
setupPopupWindow();
}
private void setupPopupWindow()
{
mPopupAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, mOptionsArray);
mPopupWindow = new ListPopupWindow(MainActivity.this);
mPopupWindow.setAdapter(mPopupAdapter);
mPopupWindow.setAnchorView(mMoreOptionsButton);
mPopupWindow.setWidth(500);
mPopupWindow.setHorizontalOffset(-380); //<--this provides the margin you need
//if you need a custom background color for the popup window, use this line:
mPopupWindow.setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(MainActivity.this, R.color.gray)));
mPopupWindow.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
//do something with item by referring to it using the "position" parameter
}
});
mMoreOptionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
mPopupWindow.show();
}
});
}
}
关键部分是调用mPopupWindow.setHorizontalOffset()
。请注意,此方法很棘手。根据您在mPopupWindow.setWidth()
中设置的值,您必须相应地调整setHorizontalOffset()
中的值。事实上,对于我的应用程序,-380
是我最终需要的完美余量。所以你可能不得不玩这个值。
我相信使用setHeight()
和setVerticalOffset()
也是如此,如果你想在弹出窗口的顶部有一些余量。
希望这可以帮助 :]
您可以在特定位置设置popUpWindow
popupWindow .showAtLocation(popupView, Gravity.CENTER, 0, 0);
public void showAtLocation(View parent, int gravity, int x, int y) {
showAtLocation(parent.getWindowToken(), gravity, x, y);
}
如果您想将其显示为DropDown,那么您可以尝试
public void showAsDropDown(View anchor, int xoff, int yoff) {
showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY);
}
看看PopupWindow http://developer.android.com/intl/es/reference/android/widget/PopupWindow.html的文档