Usando o widget NumberPicker com Strings


94

Existe uma maneira de usar o widget Android NumberPicker para escolher strings em vez de inteiros?

Respostas:


239
NumberPicker picker = new NumberPicker(this);
picker.setMinValue(0);
picker.setMaxValue(2);
picker.setDisplayedValues( new String[] { "Belgium", "France", "United Kingdom" } );

3
A chave para mim era que você tinha que definir os valores exibidos E o mínimo e o máximo antes de funcionar. Obrigado.
Ben Clayton

Isso é muito melhor do que a resposta escolhida acima.
Linh Lino

2
Mas quando clico no texto, o teclado virtual aparece e posso editar o texto.
Confundir

14
@ArulxZ Se você ainda não descobriu isso, basta chamar picker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); para evitar que o teclado apareça.
Karim Varela

Isso me ajudou! Mas aparece o valor 0 e não consigo retirá-lo .. Alguma ideia? Para explicar no meu seletor aparece 0, Bélgica, França, Reino Unido
usuário4292106

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 ajude!


Esta é de longe a melhor resposta.
samatron

se for um array, então não tem os métodos size () e get (). size () deve ser substituído por .length, e get () substituído por arrayString [value]
RexSplode

Se você usar formatador em vez de setDisplayedValues, o NumberPicker não medirá sua largura corretamente, então seu texto pode ser cortado mesmo se caber corretamente.
Matvey Rybakov

15
String value = String.valueOf(picker.getValue());

Você pode significar outra coisa, mas não está muito claro o que você quer dizer.

ATUALIZADA:

Você pode fingir definindo seu próprio formatador:

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 () ainda retornará um int, então você provavelmente deseja mapear os nomes dos países para seus ids.

ADICIONADO: A implementação do NumberPicker tem:

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

O que parece fazer um trabalho melhor com o que você deseja do que o formatador acima .. embora não seja mencionado na documentação, então provavelmente não faz parte da API pública


Eu gostaria de usá-lo para escolher, por exemplo, um país. Assim como o Spinner Widget faz, mas sem abrir um quadro adicional na parte inferior para escolher um valor.
timoschloesser

Resposta atualizada. No entanto, provavelmente há maneiras melhores de listar os países do que tentar hackear o NumberPicker para fazer esse tipo de coisa.
FunkTheMonk de

@FunkTheMonk Não consegui encontrar esse setRange()método na documentação! Alguma ideia por quê?
iTurki

Nenhum método documentado não faz parte da API pública - eles não são oficialmente suportados pelo Google e provavelmente serão alterados no futuro - você usa por sua própria conta e risco.
FunkTheMonk

1
No meu caso, essa solução tinha um pequeno bug, ao tocar em uma das opções, ele deu um pequeno erro ou desapareceu, não sei bem por quê. a resposta de nan não teve esse problema. Alguém pode me dizer o que pode estar acontecendo? De qualquer forma, acho que a resposta de nan é melhor e deve ser aceita. Mas talvez eu esteja faltando alguma coisa?
acrespo

8

tente esta solução, pode ajudá-lo

    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();

        }
    });

0

Isso funcionou para mim.

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","عربى"});
}
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.