Usando el widget NumberPicker con cadenas

95

¿Hay alguna forma de usar el widget de NumberPicker de Android para elegir cadenas en lugar de enteros?

timoschloesser
fuente

Respuestas:

241
NumberPicker picker = new NumberPicker(this);
picker.setMinValue(0);
picker.setMaxValue(2);
picker.setDisplayedValues( new String[] { "Belgium", "France", "United Kingdom" } );
yaya
fuente
3
La clave para mí era que tenía que establecer los valores mostrados Y el mínimo y el máximo antes de que funcione. Gracias.
Ben Clayton
Esto es mucho mejor que la respuesta elegida anteriormente.
Linh Lino
2
Pero cuando hago clic en el texto, el teclado virtual aparece y puedo editar el texto.
Confundir
14
@ArulxZ Si aún no lo ha descubierto, simplemente llame a picker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); para evitar que aparezca el teclado.
Karim Varela
¡Esto me ayudó! Pero aparece el valor 0 y no puedo eliminarlo .. ¿Alguna idea? Para explicar en mi selector aparece 0, Bélgica, Francia, Reino Unido
user4292106
38
NumberPicker numberPicker = new NumberPicker(this);
String[] arrayString= new String[]{"hakuna","matata","timon","and","pumba"};
numberPicker.setMinValue(0);
numberPicker.setMaxValue(arrayString.length-1);

numberPicker.setFormatter(new NumberPicker.Formatter() {
  @Override
  public String format(int value) {
    // TODO Auto-generated method stub
    return arrayString[value];
  }
});

¡Espero que ayude!

harshitpthk
fuente
Esta es, con mucho, la mejor respuesta.
samatron
si es una matriz, entonces no tiene los métodos size () y get (). size () debe reemplazarse con .length, y get () reemplazado por arrayString [valor]
RexSplode
Si usa formateador en lugar de setDisplayedValues, NumberPicker no medirá su ancho correctamente, por lo que su texto podría recortarse incluso si puede ajustarse correctamente.
Matvey Rybakov
15
String value = String.valueOf(picker.getValue());

Podría querer decir otra cosa, pero no está muy claro a qué se refiere.

ACTUALIZADO:

Puedes falsificarlo configurando tu propio formateador:

CountryFormatter implements Formatter {
    public String toString(int value) {
        switch(value) {
            case 0:
                return "England";
            case 1:
                return "France";
        }
        return "Unknown";
    }
}

picker.setFormatter(new CountryFormatter());

getValue () seguirá devolviendo un int, por lo que probablemente desee asignar los nombres de los países a sus identificadores.

AÑADIDO: La implementación de NumberPicker tiene:

public void setRange(int start, int end, String[] displayedValues)

Lo que parece hacer un mejor trabajo de lo que desea que el formateador anterior ... aunque no se menciona en la documentación, probablemente no sea parte de la API pública

FunkTheMonk
fuente
Me gustaría usarlo para elegir, por ejemplo, un país. Al igual que lo hace el widget Spinner, pero sin abrir un marco adicional en la parte inferior para elegir un valor.
timoschloesser
Respuesta actualizada, sin embargo, probablemente hay mejores formas de enumerar países que intentar piratear NumberPicker para hacer este tipo de cosas.
FunkTheMonk
@FunkTheMonk ¡No pude encontrar este setRange()método en los documentos! ¿Alguna idea de por qué?
iTurki
Ninguno de los métodos documentados no forma parte de la API pública; Google no los admite oficialmente y probablemente cambiarán en el futuro; los usa bajo su propio riesgo.
FunkTheMonk
1
En mi caso, esta solución tenía un pequeño error, al tocar una de las opciones, fallaba o desaparecía, no sé muy bien por qué. La respuesta de Nan no tenía este problema. Cualquiera puede decirme qué podría estar pasando? De todos modos, creo que la respuesta de Nan es mejor y debería ser la respuesta aceptada. ¿Pero quizás me estoy perdiendo algo?
acrespo
8

prueba esta solución, puede ayudarte

    NumberPicker pickers = new NumberPicker(this);
    String[] arrayPicker= new String[]{"abc","def","ghi","jkl","mno"};

    //set min value zero
    pickers.setMinValue(0);
    //set max value from length array string reduced 1
    pickers.setMaxValue(arrayPicker.length - 1);
    //implement array string to number picker
    pickers.setDisplayedValues(arrayPicker);
    //disable soft keyboard
    pickers.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
    //set wrap true or false, try it you will know the difference
    pickers.setWrapSelectorWheel(false);

    //create button to test selected text string
    btnPicker.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //get position (int) from number picker
            int pos = pickers.getValue();
            //get string from number picker and position
            String selecPicker = arrayPicker[pos];  
            //test toast to get selected text string
            Toast.makeText(context, selecPicker , Toast.LENGTH_SHORT).show();

        }
    });
Irvan Dwi Pangga
fuente
0

Esto funcionó para mí.

public class YourClassName extends AppCompatActivity {

NumberPicker picker = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout_file);

    picker = (NumberPicker) findViewById(R.id.pickerId_From_your_Layout_file);

     picker.setMinValue(0);
    picker.setMaxValue(3);
    picker.setDisplayedValues(new String[]{"English", "French","Kiswahili","عربى"});
}
}
NelsonRoberts
fuente