2015-12-24 17 views
10

Używam domyślnego menu podręcznego i oczekuję zachowania tego samego. Wszystko działa dobrze. Moje obawy dotyczą renderowania wyskakującego menu. Moje wyskakujące menu trzyma się z prawej strony ekranu.Wykonaj podręczne menu z marginesem

Chcę zachować zachowanie aplikacji Youtube na Androida. enter image description here

Głównie nie jestem w stanie zapewnić prawidłowego marginesu dla mojego wyskakującego menu. Proszę pomóż. Próbowałem dostarczając menu Gravity do PopUp. Ale menu pop-up wtyka się na prawo od ekranu.

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


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

Zasadniczo, to nie jest trzymanie się prawa do ekranu, ale przykleja się do kotwicy View można ustawić w Konstruktora jako kotwicy. Nie wiem, jak Youtube przedstawia PopupMenus, ale możesz spróbować użyć innej kotwicy, i.E. ustawianie niewidzialnego widoku tylko w celu dołączenia do niego PopupMenu. –

+0

Próbowałem tego samego. ale wciąż trzyma się prawej strony. Próbowałem stworzyć fałszywy widok zakotwiczenia, ale mimo to zachowanie jest takie samo. –

+0

Och, masz rację, właśnie to potwierdziłem. Nie jestem pewien, czy tak robi YouTube, ale proponuję użyć 'PopupWindow' zamiast' PopupMenu'. "PopupWindow" jest bardziej ładnie zakotwiczony w widoku, ale musisz go sam ułożyć –

Odpowiedz

1

Można ustawić popUpWindow w konkretnym miejscu

popupWindow .showAtLocation(popupView, Gravity.CENTER, 0, 0); 

public void showAtLocation(View parent, int gravity, int x, int y) { 
     showAtLocation(parent.getWindowToken(), gravity, x, y); 
    } 

Jeśli chcesz pokazać go jako rozwijanej następnie można spróbować

public void showAsDropDown(View anchor, int xoff, int yoff) { 
     showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY); 
    } 

Spójrz na dokumentacji PopupWindow http://developer.android.com/intl/es/reference/android/widget/PopupWindow.html

20

Możesz zmienić menu podręczne " s pozycja stosując następujące atrybuty: grawitacja, dropDownHorizontalOffset i dropDownVerticalOffset

Pierwszy zestaw grawitacji Gravity.END

popup.setGravity(Gravity.END); 

Następnie zmienić rozwijanych-przesunięcia tworząc styl

<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu"> 
    <item name="android:dropDownHorizontalOffset">-4dp</item> 
    <item name="android:dropDownVerticalOffset">4dp</item> 
</style> 

Jeśli chcesz pokryć widok kotwicy używać

parent="@style/Widget.AppCompat.PopupMenu.Overflow" 

Wreszcie zastosowanie MyPopupMenu do tematu

<item name="popupMenuStyle">@style/MyPopupMenu</item> 
+0

Dzięki, ustawiam grawitację na Gravity.END zrobił mi to. Domyślna wartość NO_GRAVITY wydaje się być przeznaczona do ignorowania wyrównania z jego kotwicą. – somedev

+0

Naprawdę działa dobrze, jeśli zastosujemy to samo. Dobry – saksham

+0

działa częściowo. 1. w moim motywie musiałem dodać ' ...', bez przestrzeni nazw 'android:' nie zastosował stylu menu. 2. Stosuje styl macierzysty, ale korekty przesunięcia nie mają żadnego efektu. – quezak

2

To jest trochę późno, ale mam nadzieję, że ktoś pomaga.

Próbowałem zrobić to, co robiłeś z PopupMenu, ale nic nie działało dla mnie, dopóki nie dowiedziałem się o ListPopupWindow. To lepsza alternatywa. O wiele bardziej elastyczna według mnie i możesz osiągnąć odstępy między marginesem, o które pytałeś.

Oto kod:

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(); 
      } 
     }); 
    } 
} 

Kluczowym elementem jest powołanie mPopupWindow.setHorizontalOffset(). Należy pamiętać, że ta metoda jest trudna. W zależności od wartości ustawionej w mPopupWindow.setWidth() należy odpowiednio dostosować wartość w setHorizontalOffset(). Tak się złożyło, że dla mojej aplikacji, -380 była idealną ilością marginesu potrzebną od końca. Być może będziesz musiał grać z tą wartością.

Sądzę, że to samo można powiedzieć o używaniu setHeight() i setVerticalOffset(), jeśli chcesz mieć margines u góry okna podręcznego.

Nadzieja to pomaga:]

Powiązane problemy