2015-12-24 28 views
10

Sto usando il menu pop predefinito e mi aspetto il comportamento dello stesso. Tutto funziona bene. Qual è la mia preoccupazione per quanto riguarda il rendering del menu a comparsa. Il mio menu popup si blocca a destra dello schermo.Menu popup pop-up con margine

Desidero il comportamento utilizzato dall'app YouTube per Android. enter image description here

Non sono principalmente in grado di fornire il margine destro al mio menu a comparsa. Per favore aiuto. ho provato a fornire Gravity al menu a comparsa. Ma il menu a comparsa si attacca alla destra dello schermo.

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


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

In sostanza, non è attaccare a destra sullo schermo, ma si attacca al ancoraggio View si imposta nel costruttore come ancoraggio. Non so come YouTube mostri PopupMenus, ma potresti provare a utilizzare un'ancora diversa, ad esempio. impostando una vista invisibile allo scopo di associare il PopupMenu ad esso. –

+0

Ho provato lo stesso. ma ancora si attacca a destra. Ho provato a creare la vista di ancoraggio falso, ma il comportamento è lo stesso. –

+0

Oh, hai ragione, ho appena confermato da solo. Non sono sicuro che sia così che lo fa YouTube, ma suggerirei di provare a usare 'PopupWindow' al posto di' PopupMenu'. Il 'PopupWindow' è ancorato più piacevolmente alla vista, ma devi metterlo da solo –

risposta

1

È possibile impostare PopupWindow in particolare posizione

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

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

Se si desidera mostrare come discesa allora si può provare

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

dare uno sguardo su Documentazione di PopupWindow http://developer.android.com/intl/es/reference/android/widget/PopupWindow.html

20

È possibile modificare il PopupMenu ' la posizione s utilizzando i seguenti attributi: gravità, dropDownHorizontalOffset e dropDownVerticalOffset

Primo set gravità per Gravity.END

popup.setGravity(Gravity.END); 

poi cambiare discesa-offset con la creazione di uno stile

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

Se si desidera sovrapporre la vista di ancoraggio utilizzare

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

applicano Infine MyPopupMenu al vostro tema

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

Grazie, impostando la gravità su Gravity.END ha fatto il trucco per me. Il valore predefinito NO_GRAVITY sembra essere quello di ignorare l'allineamento con la sua ancora. – somedev

+0

funziona davvero bene se implementiamo lo stesso. Il buono – saksham

+0

funziona parzialmente. 1. nel mio tema ho dovuto aggiungere ' ...', senza lo spazio dei nomi 'android:' non ha applicato lo stile del menu. 2. Applica lo stile genitore, ma le correzioni dell'offset non hanno alcun effetto. Aggiornamento – quezak

2

Questo è un po 'tardi, ma spero che questo aiuta qualcuno.

Stavo provando a fare quello che stavi facendo con un PopupMenu ma nulla funzionava per me fino a quando non ho saputo di ListPopupWindow. È un'alternativa migliore. Molto più flessibile secondo me e tu puoi ottenere la distanza dal margine che stavi chiedendo.

Ecco il codice:

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

La parte fondamentale sta chiamando mPopupWindow.setHorizontalOffset(). Essere consapevoli del fatto che questo metodo è difficile. A seconda del valore impostato in mPopupWindow.setWidth(), è necessario regolare il valore in setHorizontalOffset() di conseguenza. È successo che per la mia app, -380 era la quantità di margine che avevo bisogno dalla fine. Quindi potresti dover giocare un po 'con questo valore.

Credo che lo stesso si possa dire per l'utilizzo di setHeight() e setVerticalOffset() se si desidera un margine nella parte superiore della finestra popup.

Spero che questo aiuti:]