Usando o widget NumberPicker com Strings

94

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

timoschloesser
fonte

Respostas:

239
NumberPicker picker = new NumberPicker(this);
picker.setMinValue(0);
picker.setMaxValue(2);
picker.setDisplayedValues( new String[] { "Belgium", "France", "United Kingdom" } );
nan
fonte
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!

harshitpthk
fonte
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

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

        }
    });
Irvan Dwi Pangga
fonte
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","عربى"});
}
}
NelsonRoberts
fonte