Внедрить всплывающее меню с пометкой
Я использую меню по умолчанию по умолчанию и ожидаю, что это будет так. Все работает нормально. Какова моя озабоченность в отношении создания всплывающего меню. Мое всплывающее меню находится справа от экрана.
Мне нужно поведение, используемое приложением Youtube для android. ![введите описание изображения здесь]()
В основном я не могу предоставить правую маржу во всплывающем меню. Пожалуйста помоги.
Я попытался предоставить Gravity в PopUp Menu. Но всплывающее меню придерживается права экрана.
PopupMenu popupMenu = new PopupMenu(mContext, anchor, Gravity.LEFT);
popupMenu.getMenuInflater().inflate(R.menu.menu_edit_accessory, popupMenu.getMenu());
Ответы
Ответ 1
Вы можете изменить свою позицию PopupMenu, используя следующие атрибуты:
гравитация, 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>
Ответ 2
Это немного поздно, но я надеюсь, что это поможет кому-то.
Я пытался сделать то, что вы делали с 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()
, если вы хотите получить некоторый запас вверху всплывающего окна.
Надеюсь, что это поможет:]
Ответ 3
Вы можете установить 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