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.
- OnAnimationEnd no se llama, onAnimationStart funciona bien
- SetOnItemClickListener de ListView de Android de PopupWindow no se llama
- ¿Cómo mostrar el teclado en PopupWindow?
- Android: agrega la vista al diseño haciendo que el diseño esté delante de ActionBar
- Android popupwindow está por encima del teclado virtual
¿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:
- Android PopupWindow y WRAP_CONTENT no funcionan juntos
- Orden de PopupWindow z
- La actividad de diálogo se oculta bajo la pantalla de llamada cuando el bloqueo seguro está activado, android
- Error de hilandero en la ventana emergente cuando hago clic
- PopupWindow - Descartar cuando se hace clic fuera
- Android: setText () para TextView en PopupWindow no funciona
- Popupwindow: ShowAsDropDown como superior derecha en lugar de inferior izquierda?
- Diálogo personalizado de Android como 'Contacto rápido'
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);
- Notificación incorrecta enviada desde el paquete No se pudo expandir RemoteViews
- Cómo implementar los métodos obsoletos de Notificación