Implementar menú emergente con margen
Estoy usando el menú pop por defecto y espero el comportamiento de la misma. Todo está funcionando bien. Lo que mi preocupación es con respecto a la prestación de pop-up menú. Mi menú emergente se pega a la derecha de la pantalla.
Quiero que el comportamiento utilizado por Youtube app para android.
- Color de texto del menú emergente de Android (AppCompat)
- Cambiar el estilo del menú emergente - no funciona
- Detectar que un PopupMenu está cerrado en el nivel 11 de API
- Posición de popupmenu de Android
- Cómo cambiar el color de texto y el tamaño de un menú emergente en android?
Principalmente no soy capaz de proporcionar el margen derecho a mi menú emergente. Por favor ayuda. He intentado proporcionar gravedad a menú PopUp. Pero el menú emergente se pega a la derecha de la pantalla.
PopupMenu popupMenu = new PopupMenu(mContext, anchor, Gravity.LEFT); popupMenu.getMenuInflater().inflate(R.menu.menu_edit_accessory, popupMenu.getMenu());
- ¿Cómo puedo arreglar NoClassDefFoundError en Android para android.widget.PopupMenu?
- ¿Cómo mostrar el menú emergente exacto debajo de la barra de acción?
- Se ha intentado finalizar un evento de entrada pero el receptor de eventos de entrada ya se ha eliminado
- PopupMenu hace clic para que RecyclerView se desplace
- Creación de un menú de opciones emergentes en una barra de acción contextual
- PopupMenu no se encuentra correctamente dentro de RecyclerView
- ¿Cómo puedo editar las dimensiones de un elemento de menú PopUp en Android?
- Android PopupWindow se oculta detrás de los botones de navegación en Nexus 5
Puedes cambiar la posición de tu PopupMenu usando los siguientes atributos: gravity , dropDownHorizontalOffset y dropDownVerticalOffset
Primero ajuste la gravedad a Gravity.END
popup.setGravity(Gravity.END);
Luego cambia tus dropdown-offsets creando un estilo
<style name="MyPopupMenu" parent="@style/Widget.AppCompat.PopupMenu"> <item name="android:dropDownHorizontalOffset">-4dp</item> <item name="android:dropDownVerticalOffset">4dp</item> </style>
Si desea superponer la vista ancla, utilice
parent="@style/Widget.AppCompat.PopupMenu.Overflow"
Por último, aplique MyPopupMenu a su tema
<item name="popupMenuStyle">@style/MyPopupMenu</item>
Esto es un poco tarde, pero espero que esto ayude a alguien.
Yo estaba tratando de hacer lo que estaba haciendo con un PopupMenu
pero nada funcionaba para mí hasta que me enteré de ListPopupWindow
. Es una alternativa mejor. Mucho más flexible en mi opinión y usted puede alcanzar el margen-espaciamiento que usted preguntaba alrededor.
Aquí está el código:
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 clave es llamar mPopupWindow.setHorizontalOffset()
. Tenga en cuenta que este método es difícil. Dependiendo del valor que establezca en mPopupWindow.setWidth()
, tendrá que ajustar el valor en setHorizontalOffset()
consecuencia. Simplemente sucedió que para mi aplicación, -380
era la cantidad perfecta de margen que necesitaba desde el final. Así que puede que tenga que jugar con este valor un poco.
Creo que lo mismo se puede decir de usar setHeight()
y setVerticalOffset()
si desea un margen en la parte superior de su ventana emergente.
Espero que esto ayude :]
Puede configurar popUpWindow en una ubicación determinada
popupWindow .showAtLocation(popupView, Gravity.CENTER, 0, 0); public void showAtLocation(View parent, int gravity, int x, int y) { showAtLocation(parent.getWindowToken(), gravity, x, y); }
Si quieres mostrarlo como DropDown entonces puedes intentarlo
public void showAsDropDown(View anchor, int xoff, int yoff) { showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY); }
Echa un vistazo a la documentación de PopupWindow http://developer.android.com/intl/es/reference/android/widget/PopupWindow.html
- ¿Cómo solucionar los atributos personalizados y la renovación de nombres de paquetes de Android Libraries durante la compilación?
- Cómo agregar el margen entre las pestañas en TabLayout?