ListPopupWindow no obedeciendo WRAP_CONTENT width spec

Estoy intentando utilizar ListPopupWindow para demostrar una lista de secuencias vía un ArrayAdapter (eventual éste será un adaptador de encargo más complejo). El código está abajo. Como se muestra en la captura de pantalla, el ListPopupWindow resultante parece actuar como si el ancho del contenido sea cero. Muestra el número adecuado de elementos, los elementos son todavía clicables, y haciendo clic con éxito producir una Toast , por lo que al menos eso está funcionando correctamente.

Una nota interesante: podría proporcionar un ancho en píxeles a popup.setWidth(...) lugar de ListPopupWindow.WRAP_CONTENT y mostrará parte del contenido, pero esto parece muy inflexible.

¿Cómo hago que ListPopupWindow envuelva su contenido?

Actividad de prueba:

 public class MainActivity extends Activity { private static final String[] STRINGS = {"Option1","Option2","Option3","Option4"}; private View anchorView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getActionBar().setHomeButtonEnabled(true); setContentView(R.layout.activity_main); anchorView = findViewById(android.R.id.home); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: showPopup(); return true; } return super.onOptionsItemSelected(item); } private void showPopup() { ListPopupWindow popup = new ListPopupWindow(this); popup.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, STRINGS)); popup.setAnchorView(anchorView); popup.setWidth(ListPopupWindow.WRAP_CONTENT); popup.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "Clicked item " + position, Toast.LENGTH_SHORT).show(); } }); popup.show(); } } 

captura de pantalla:

Introduzca aquí la descripción de la imagen

Puede medir el ancho del contenido del adaptador:

 private int measureContentWidth(ListAdapter listAdapter) { ViewGroup mMeasureParent = null; int maxWidth = 0; View itemView = null; int itemType = 0; final ListAdapter adapter = listAdapter; final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); final int count = adapter.getCount(); for (int i = 0; i < count; i++) { final int positionType = adapter.getItemViewType(i); if (positionType != itemType) { itemType = positionType; itemView = null; } if (mMeasureParent == null) { mMeasureParent = new FrameLayout(mContext); } itemView = adapter.getView(i, itemView, mMeasureParent); itemView.measure(widthMeasureSpec, heightMeasureSpec); final int itemWidth = itemView.getMeasuredWidth(); if (itemWidth > maxWidth) { maxWidth = itemWidth; } } return maxWidth; } 

Y en la función showPopup ():

  ArrayAdapter arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, STRINGS); popup.setAdapter(arrayAdapter); popup.setAnchorView(anchorView); popup.setContentWidth(measureContentWidth(arrayAdapter)); 

El problema es con la implementación de ListPopupWindow . Comprobé el código fuente y usar setContentWidth(ListPopupWindow.WRAP_CONTENT) o setWidth(ListPopupWindow.WRAP_CONTENT) hace que la ventana emergente use el ancho de su vista ancla en su lugar.

Creo que lo mejor es usar el PopupMenu. ejemplo:

 final PopupMenu popupMenu = new PopupMenu(mActivity, v); popupMenu.getMenu().add("test"); popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(final MenuItem item) { return true; } }); popupMenu.show(); 

Sólo me gustaría establecer una dimensión en su archivo dimen.xml a 160dp o menos:

 <dimen name="overflow_width">160dp</dimen> 

A continuación, establezca su ancho de ventana utilizando el método getDimensionPixelSize para convertir en píxeles:

 int width = mContext.getResources().getDimensionPixelSize(R.dimen.overflow_width); mListPopupWindow.setWidth(width); 

Eso debe mantener la densidad del tamaño independiente.

Creo que su problema reside en su ArrayAdapter usando simple_list_item_1. Si miras el código fuente de ese elemento, tiene la propiedad de

 android:layout_width="match_parent" 

Si miras la fuente aquí puedes crear tu propia new_list_item_1.xml con la misma información pero cambiándola a android:layout_width="wrap_content" y luego usarla en tu ArrayAdapter

Usted puede conseguir realmente el padre del anchorView (puesto que el anchorView actual es generalmente un botón) y basar su anchura de allí. Por ejemplo:

 popup.setWidth(((View)anchor.getParent()).getWidth()/2); 

De esa manera usted puede obtener una anchura flexible.

ListPopupWindow.setWidth (400);

ListPopupWindow.setHeight (ListPopupWindow.WRAP_CONTENT);

  • PopupWindow en una coordenada específica sin vista de anclaje
  • Popup (usando PopupWindow o Dialog) llena el ancho de la pantalla sin razón aparente
  • ViewPager con Fragmentos dentro de PopupWindow (o DialogFragment) - Error no se encontró ninguna vista para id para el fragmento
  • Creación de un fragmento en una ventana emergente - en Android
  • Desenfoque o fondo oscuro cuando Android PopupWindow está activo
  • Cambiar el color de fondo cuando se muestra una ventana emergente
  • ¿Cómo hacer una simple ventana emergente de Android?
  • ¿Cómo mostrar PopupWindow en una ubicación especial?
  • Android PopupWindow se oculta detrás de los botones de navegación en Nexus 5
  • Cómo configurar el diseño y el tamaño de un PopupWindow
  • Animaciones siguientes y anteriores
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.