2015-12-24 3 views
10

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

Я хочу, чтобы поведение, используемое приложением Youtube для Android. enter image description here

В основном я не могу предоставить правую маржу во всплывающее меню. Пожалуйста помоги. Я попытался предоставить Gravity в PopUp Menu. Но всплывающее меню придерживается права экрана.

PopupMenu popupMenu = new PopupMenu(mContext, anchor, Gravity.LEFT); 


     popupMenu.getMenuInflater().inflate(R.menu.menu_edit_accessory, popupMenu.getMenu()); 
+0

В принципе, это не прилипает к праву на экран, но он прилипает к анкерной View вы установили в конструкторе в качестве якоря. Я не знаю, как Youtube представляет PopupMenus, но вы можете попробовать использовать другой якорь, т.е. устанавливая невидимое представление только с целью присоединения к нему PopupMenu. –

+0

Я пробовал то же самое. но все же он придерживается права. Я попытался создать фальшивый анкерный вид, но все же поведение такое же. –

+0

О, ты прав, я только что подтвердил. Не уверен, что это так, как это делает YouTube, но я бы предложил попробовать использовать «PopupWindow» вместо «PopupMenu». «PopupWindow» привязан более красиво к виду, но вы должны сами его выложить –

ответ

1

Вы можете установить 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

20

Вы можете изменить свой PopupMenu ' s положение, используя следующие атрибуты: тяжести, 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> 
+0

Спасибо, установив гравитацию на Gravity.END сделал трюк для меня. Значение по умолчанию NO_GRAVITY, по-видимому, связано с игнорированием выравнивания с его привязкой. – somedev

+0

Действительно работает хорошо, если мы реализуем то же самое. Хорошо – saksham

+0

работает частично. 1. В моей теме мне пришлось добавить ' ...', без пространства имен 'android:' он не применял стиль меню. 2. Он применяет родительский стиль, но коррекции смещения не имеют никакого эффекта. – quezak

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(), если вы хотите получить некоторый запас в верхней части всплывающего окна.

Надеется, что это помогает:]

Смежные вопросы