Это немного поздно, но я надеюсь, что это поможет кому-то.
Я пытался сделать то, что вы делали, с 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()
, если вы хотите получить некоторый запас в верхней части всплывающего окна.
Надеется, что это помогает:]
В принципе, это не прилипает к праву на экран, но он прилипает к анкерной View вы установили в конструкторе в качестве якоря. Я не знаю, как Youtube представляет PopupMenus, но вы можете попробовать использовать другой якорь, т.е. устанавливая невидимое представление только с целью присоединения к нему PopupMenu. –
Я пробовал то же самое. но все же он придерживается права. Я попытался создать фальшивый анкерный вид, но все же поведение такое же. –
О, ты прав, я только что подтвердил. Не уверен, что это так, как это делает YouTube, но я бы предложил попробовать использовать «PopupWindow» вместо «PopupMenu». «PopupWindow» привязан более красиво к виду, но вы должны сами его выложить –