¿Cómo establezco la longitud máxima para la lista desplegable de un hilandero?

Tengo una ruleta que actualmente oscurece un poco de texto debajo de la ruleta cuando se abre. Necesito limitar la longitud máxima de desplegable de la hiladora, ya sea a través de código java o XML, para que no oscurezca este texto.

El diseño actual es el ejemplo izquierdo mientras que el diseño deseado está a la derecha. explicación

¿Cómo hago para limitar la distancia hasta la que se abre el hilandero? En la actualidad, desciende para llenar toda la parte de la pantalla por debajo de ella.

Una forma de lograr esto es usar IcsSpinner de ActionBarSherlock. Hice las modificaciones necesarias para limitar el tamaño de la ruleta y que parece funcionar muy bien.

Realice las modificaciones siguientes en IcsListPopupWindow.

Agregue una variable de instancia:

private int mDropDownVerticalOffsetBottom; 

Añada un método para establecer esta variable:

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

Alterar la llamada a getMaxAvailableHeight a (mDropDownVerticalOffsetBottom se agregó):

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

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

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

Y considere que el desplazamiento al calcular la distancia a la parte inferior:

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

Ahora modifique IcsSpinner.java para implementar el método setter para el offset:

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

Ahora "todo" lo que necesita hacer es establecer el desplazamiento en el valor correcto. He aquí cómo 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 } }); 

La suposición es que root_layout llena toda la ventana excluyendo todos los elementos decorativos.

El paso final es crear el propio hilador:

  // actionDropDownStyle is an attribute set in the theme to eg @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 alguien más lo mencionó, no será capaz de lograr esto sin su propia aplicación spinner y ya que ActionBarSherlock viene con uno, ¿por qué no utilizarlo? Sin duda, es menos trabajo que escribir uno propio. Si no usa la biblioteca para la barra ActionBar, retire todos los archivos de recursos que no necesita y utilice Proguard para quitar 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 ).

He buscado un poco y parece que no puedo encontrar una solución a esto en cualquier lugar. Usted puede tener que ir una ruta ligeramente diferente recreando la funcionalidad de un hilandero, pero usando los botones y los diálogos intead.

Suponiendo que esté utilizando un ArrayAdapter para la hiladora, pruebe esto:

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

Cree un AlertDialog Dialog personalizado o AlertDialog y AlertDialog un ListView con el ArrayAdapter . Para el método onClick , pulse el valor de la opción seleccionada y rellene 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 cualquier tamaño que desee y el exceso de opciones siempre será desplazable.

Sé que no es ideal, pero no he encontrado ninguna forma de cambiar la altura de la parte "desplegable" de un spinner.

Lo siento si esto no era lo que esperabas.

EDIT: Alguien más hizo la misma pregunta aquí antes y resulta que fueron con el método exacto que acabo de describir. Puedes ver el código de ejemplo que usaron aquí: Echa un vistazo a la pregunta / código

El tamaño de un conjunto Spinner tiene android: layout_width = "wrap_content" está determinado por su contenido. Si quieres que las cosas sean elipses, eso depende de ti en tu SpinnerAdapter, cuando crees tus vistas de filas.

O, hard-wire un androide: layout_width que se fija en tamaño.

O, en lugar de usar LinearLayout, use RelativeLayout y estructura sus reglas de tal manera que el Spinner ocupe el espacio restante en la fila, anclándolo al lado izquierdo de la pantalla y al lado izquierdo del primer EditText. Aunque no estoy 100% seguro de lo que sucede entonces si el contenido es demasiado grande – probablemente sólo se trunca.

Pienso que usted tiene que utilizar el hilandero de encargo para su requisito. No hay ningún método inbuilt o propiedad de xml que puede ayudar.

Consulte este ejemplo para obtener ayuda.

https://github.com/ankitthakkar/DropDownSpinner

Espero que esto funcione.

Nota: Esta es la respuesta cambiada.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.