studio que listas enlazados ejemplo desplegables control android height spinner

que - spinner android ejemplo



¿Cómo establezco la longitud máxima para la lista desplegable de una ruleta? (3)

Tengo un girador que actualmente oculta un poco de texto debajo del girador cuando se abre. Necesito limitar la longitud máxima del menú desplegable, ya sea a través del código Java o XML, para que no oculte este texto.

El diseño actual es el ejemplo de la izquierda, mientras que el diseño deseado está a la derecha.

¿Cómo hago para limitar la distancia a la que cae el girador cuando se abre? En la actualidad, se despliega para llenar toda la parte de la pantalla debajo de ella.


Creo que tiene que usar un control personalizado para su requerimiento. No hay ningún método incorporado o propiedad xml que pueda ayudar.

Vea este ejemplo para obtener ayuda.

https://github.com/ankitthakkar/DropDownSpinner

Espero que esto funcione.

Nota: Se ha cambiado la respuesta.


He buscado bastante y parece que no puedo encontrar una solución para esto en ningún lado. Es posible que deba ir por una ruta ligeramente diferente al recrear la funcionalidad de un girador, pero al usar botones y cuadros de diálogo en la izquierda.

Suponiendo que estés usando un ArrayAdapter para el spinner, prueba esto:

Reemplace su Spinner con un botón que tenga un icono de flecha hacia abajo.

Cree un Dialog personalizado o un Dialog AlertDialog y AlertDialog un ListView con el ArrayAdapter . Para el método onClick , presione el valor de la opción seleccionada y complete una variable static y el texto del botón con el valor elegido. De esta manera, puede hacer que el tamaño del cuadro de diálogo sea del tamaño que desee y las opciones en exceso siempre serán desplazables.

Sé que no es lo ideal, pero no he encontrado ninguna forma de cambiar la altura de la parte "desplegable" de una rueda giratoria.

Lo siento si esto no era lo que esperabas.

EDITAR: Alguien más hizo la misma pregunta aquí antes y resulta que fueron con el método exacto que acabo de describir. Puede ver el código de muestra que usaron aquí: consulte la pregunta / el código


Una forma de lograr esto es usar ActionBarSherlock de ActionBarSherlock. Hice las modificaciones necesarias para limitar el tamaño del girador y eso parece funcionar bien.

Realice las siguientes modificaciones en IcsListPopupWindow.

Agregue una variable de instancia:

private int mDropDownVerticalOffsetBottom;

Agrega un método para establecer esta variable:

public void setVerticalOffsetBottom(int offsetBottom) { mDropDownVerticalOffsetBottom = offsetBottom; }

Cambie la llamada para obtenerMaxAvailableHeight a (se agregó mDropDownVerticalOffsetBottom):

final int maxHeight = /*mPopup.*/getMaxAvailableHeight( mDropDownAnchorView, mDropDownVerticalOffset, mDropDownVerticalOffsetBottom, ignoreBottomDecorations);

Cambia la firma del método para incluir esa variable:

private int getMaxAvailableHeight(View anchor, int yOffset, int yOffsetBottom, boolean ignoreBottomDecorations) {

Y tenga en cuenta ese desplazamiento al calcular la distancia al fondo:

final int distanceToBottom = bottomEdge - (anchorPos[1] + anchor.getHeight()) - yOffset - yOffsetBottom;

Ahora modifique IcsSpinner.java para implementar el método de establecimiento para el desplazamiento:

private DropdownPopup mPopup; // <- needs to be a DropdownPopup instead of a SpinnerPopup public void setVerticalOffsetBottom(int offsetBottom) { mPopup.setVerticalOffsetBottom(offsetBottom); }

Ahora "todo" lo que debe hacer es establecer el desplazamiento en el valor correcto. Así es como lo hice (lo probé y funcionó en dos dispositivos de prueba):

final View root = findViewById(R.id.root_layout); final View view = findViewById(R.id.view_not_to_be_obscured); root.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { public void onGlobalLayout() { root.getViewTreeObserver().removeGlobalOnLayoutListener(this); int[] locations = new int[2]; root.getLocationOnScreen(locations); int y1 = locations[1]; int h1 = root.getHeight(); view.getLocationOnScreen(locations); int y2 = locations[1]; int offset = y1 + h1 - y2; // here we initialize the spinner } });

El supuesto es que root_layout llena toda la ventana, excluyendo todos los elementos decorativos.

El último paso es crear el propio hilandero:

// actionDropDownStyle is an attribute set in the theme to e.g. @style/Widget.Sherlock.Spinner.DropDown.ActionBar or @style/Widget.Sherlock.Light.Spinner.DropDown.ActionBar for light theme IcsSpinner spinner = new IcsSpinner(context, null, R.attr.actionDropDownStyle); // yes here we set the offset! spinner.setVerticalOffsetBottom(offset); spinner.setPadding(spinner.getPaddingLeft(), 0, spinner.getPaddingRight(), 0); spinner.setId(R.id.some_id); spinner.setAdapter(yourAdapter); // you can use a simple ArrayAdapter or whatever you need // create ICS LinearLayout LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE ); IcsLinearLayout linearLayout = (IcsLinearLayout) inflater.inflate(R.layout.abs__action_bar_tab_bar_view, null); linearLayout .setPadding(listNavLayout.getPaddingLeft(), 0, listNavLayout.getPaddingRight(), 0); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); params.gravity = Gravity.CENTER; linearLayout .addView(spinner, params);

Ahora que puede parecer complicado, pero como mencionó otra persona, no podrá lograr esto sin su propia implementación de giro y, dado que ActionBarSherlock viene con uno, ¿por qué no usarlo? Ciertamente es menos trabajo que escribir el tuyo. Si no usa la biblioteca para el ActionBar, elimine todos los archivos de recursos que no necesita y use Proguard para eliminar todas las clases no utilizadas. Probablemente podría lograr lo mismo utilizando AppCompat (consulte aquí: https://github.com/android/platform_frameworks_support/tree/master/v7/appcompat/src/android/support ).