Внедрить всплывающее меню с пометкой

Я использую меню по умолчанию по умолчанию и ожидаю, что это будет так. Все работает нормально. Какова моя озабоченность в отношении создания всплывающего меню. Мое всплывающее меню находится справа от экрана.

Мне нужно поведение, используемое приложением 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