Pregunta

Tengo una pantalla donde el usuario tiene muchos elementos a modo de entrada de espacio de pantalla es un bien escaso.

Quiero el aspecto del widget en la pantalla (antes de que el usuario presiona) sea similar a un EditarTexto o la parte izquierda del widget Spinner (sin el triángulo hacia abajo normal) en el lado derecho de la Spinner. Luego, cuando el usuario presiona el widget, él / ella recibirá el diálogo de selección Spinner normal.

¿Hay algún atributo de estilo Spinner puedo cambiar para lograr esto?

No he podido ver un código como éste.

Gracias

¿Fue útil?

Solución

Una cosa que puede hacer es código fuente toma de Spinner de la base de código de Android, junto con los diseños y los recursos relacionados, y los utilizan para crear su propio widget personalizado (probablemente sólo se necesita quitar la flecha de la disposición y ajustar la un poco de código en función de sus necesidades).

EDIT: Tienes razón, a raíz de ese puesto fue en realidad muy simple :) que tiene que hacer dos cosas. En primer lugar, crear un archivo styles.xml según Resol / valores, abrirlo y añadir lo siguiente:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style parent="@android:style/Widget.Spinner" name="SpinnerAsEditText">
        <item name="android:background">@android:drawable/edit_text</item>
    </style>
</resources>

A continuación, en su diseño, añadir el Spinner como esto:

<Spinner style="@style/SpinnerAsEditText" anyOtherAttributeYouNeed="..."></Spinner>

Eso es todo, ahora la ruleta se verá como un EditarTexto llano, sin que flecha hacia abajo inútil y molesto.

Otros consejos

Esto es muy una vieja pregunta, pero creo que sigue siendo relevante, así que aquí está mi respuesta:

más simple Método

lencinhaus respuesta es correcta. Funciona, pero se puede hacer de una manera aún más simple: Sólo tiene que añadir otro fondo en la misma. El siguiente ejemplo utiliza el fondo Button estándar para un look-and-feel más homogénea:

<Spinner
    android:id="@+id/my_spinner"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:prompt="@string/my_prompt" 
    android:background="@android:drawable/btn_default"
    />       

El syle utilizado en la otra respuesta no hace más que aplicar un fondo para el widget. Eso se puede hacer directamente en el widget, ahorrando la necesidad de un nuevo archivo XML. Por supuesto, si se va a aplicar un estilo a la ruleta de todos modos, no hay nada malo con este enfoque.

¿Por qué?

La clave para entender cómo funciona la mentira en la descripción de los archivos PNG 9-patch . Las líneas en la derecha y en la parte inferior se usan para el relleno, es decir, para mantener un cierto espacio de ser utilizado por su contenido. En este caso, el interior de texto. El fondo Spinner estándar utiliza una imagen con una flecha a la derecha que se encuentra fuera del área de texto utilizable. Véase la figura 1 a continuación para una ilustración:

Figura 1. original Spinner Fundamentos 9-patch PNG http://tinypic.com/images/404 .gif
Figura 1. Spinner original Fundamentos PNG 9-patch.

Sólo la eliminación de la flecha no es suficiente, ya que el relleno permanece allí. Es necesario utilizar una nueva imagen de 9-patch con una disminución de relleno (véase la figura 2 para un ejemplo basado en la fig. 1) o de un solo uso de la precompilado imágenes 9-patch sin tanto relleno, tales como los de EditText (< strong> @android:drawable/edit_text ) o Button ( @android:drawable/btn_default ).

Figura 2. Modificado Spinner Fundamentos PNG 9-patch con el acolchado reducida
Spinner Figura 2. Modificado Fundamentos PNG 9-patch con el acolchado reducida.

La comprensión de este le permitirá crear sus propios fondos para la Spinner (y, de hecho, para cualquier tipo de artilugio).

Una mejor explicación de la 9-archivos de revisión se puede encontrar aquí

Es muy fácil crear los archivos con la draw9patch ejecutable desde el SDK ( leer sobre ello aquí ), pero nada impide que usted utilice Photoshop o Gimp en su lugar. Recuerde, PNG 9-Patch son PNG llanos justos! La única advertencia es para asegurarse de que se dibuja sólo a las líneas exteriores de píxeles y que el resto de los píxeles son completamente transparentes. Antialiasing cerca de la frontera podría producir resultados inesperados.

Me acaba de llegar a esta pregunta, porque mi spinner no estaba mostrando el indicador de triángulo, ahora entiendo por qué: yo estaba sentado al fondo de "blanco":

android:background="#FFFFFFFF"

Esto elimina el (la imagen de fondo spinner y el relleno indicado por Aleadam) Indicador de triángulo.

Para mi problema, resolverlo añadir un LinearLayout padres sólo para poner el fondo en "blanco".

Darle un fondo, la flecha va a desaparecer.

android:background="@drawable/bg"

Yo estaba teniendo el mismo problema y ha cambiado el estilo de:

style="@style/Widget.AppCompat.Light.DropDownItem.Spinner"

y funcionó.

Qué extraño, se encuentra ubicado en DropDownItem.

Mientras que el que tiene el triángulo inferior se llama la normal.

Saludos!

Por tema relacionado de espacio ocupado cuando realmente hace clic en spinner, me encontré por casualidad que se puede quitar esos grandes indicadores de selección a la derecha. Se obtiene una lista básica separados por líneas, pero puede hacer clic en un elemento y todavía funciona.

Configurar una ruleta como éste para obtener los indicadores de selección:

    Spinner s1 = (Spinner) findViewById(R.id.spinner1);
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(
            this, R.array.petals, android.R.layout.simple_spinner_item);
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    s1.setAdapter(adapter1);

En ningún indicador acaba de salir de la línea setDropDownViewResource.

¿Por qué no le vayan a hacer un cuadro de diálogo con la lista. De acuerdo a sus requerimientos, crear un campo EditarTexto, añadir setOnFocusChangeListener y luego mostrar un cuadro de diálogo con los elementos de la lista en onFocusChange (método). Para dialogar con elementos de la lista

new AlertDialog.Builder(this)
                .setTitle("<Title>")
                .setItems(R.array.<ItemsArrayName>, new DialogInterface.OnClickListener(){
     @Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub  
}}).show();

Sin respuesta fue útil para mí, así que aquí es una solución de una línea muy simple que trabajaba.

  //some spinner initialisation stuff->
mySpinner.setAdapter(adapter);

  //some spinner initialisation stuff->
mySpinner.getBackground().setColorFilter(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

No se puede decir con seguridad si va a trabajar con sólo un diseño predeterminado spinner, pero funcionó bien con mi costumbre que he creado para otras necesidades.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top