문자열과 함께 NumberPicker 위젯 사용


94

정수 대신 문자열을 선택하기 위해 Android NumberPicker 위젯을 사용하는 방법이 있습니까?

답변:


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

3
저에게 핵심은 작동하기 전에 표시된 값과 최소 및 최대를 설정해야한다는 것입니다. 감사.
Ben Clayton

이것은 위에서 선택한 답변보다 훨씬 낫습니다.
Linh Lino 2014

2
하지만 텍스트를 클릭하면 소프트 키보드가 튀어 나와 텍스트를 편집 할 수 있습니다.
혼란

14
@ArulxZ 아직 이것을 이해하지 못했다면 picker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); 키보드가 튀어 나오는 것을 방지합니다.
Karim Varela

이것은 나를 도왔다! 그러나 그것은 값 0으로 나타나고 그것을 제거 할 수 없습니다 .. 어떤 생각? 내 선택기에서 설명하는 것은 0, 벨기에, 프랑스, 영국 나타납니다
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];
  }
});

도움이 되길 바랍니다!


이것이 가장 좋은 대답입니다.
samatron 2015 년

배열이면 size () 및 get () 메서드가 없습니다. size ()는 .length로, get ()은 arrayString [value]로 바꿔야합니다
RexSplode

대신 포맷터를 사용 setDisplayedValues하면 NumberPicker가 너비를 제대로 측정하지 않으므로 텍스트가 제대로 맞더라도 잘릴 수 있습니다.
맷비 리바 코프

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

당신은 다른 것을 의미 할 수 있지만 당신이 의미하는 바는 명확하지 않습니다.

업데이트 :

자체 포맷터를 설정하여 가짜로 만들 수 있습니다.

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 ()는 여전히 int를 반환하므로 국가 이름을 해당 ID에 매핑 할 수 있습니다.

추가 : NumberPicker의 구현은 다음과 같습니다.

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

위의 포맷터보다 원하는 작업을 더 잘 수행하는 것 같습니다. 문서에 언급되어 있지 않지만 아마도 공개 API의 일부가 아닐 것입니다.


예를 들어 국가를 선택하는 데 사용하고 싶습니다. Spinner 위젯과 마찬가지로 하단에 추가 프레임을 열어 값을 선택하지 않습니다.
timoschloesser

답변이 업데이트되었지만 NumberPicker를 해킹하는 것보다 국가를 나열하는 더 좋은 방법이있을 것입니다.
FunkTheMonk 2011

@FunkTheMonk setRange()문서 에서이 방법을 전혀 찾을 수 없었 습니다! 이유는 무엇입니까?
iTurki

문서화 된 메소드는 공개 API의 일부가 아닙니다. Google에서 공식적으로 지원하지 않으며 향후 변경 될 가능성이 있습니다. 사용자의 책임하에 사용합니다.
FunkTheMonk

1
제 경우에는이 솔루션에 작은 버그가 있었는데, 옵션 중 하나를 만질 때 결함이 있거나 사라졌습니다. 이유를 잘 모르겠습니다. nan의 대답에는이 문제가 없었습니다. 누구나 무슨 일이 일어날 수 있는지 말해 줄 수 있습니까? 어쨌든 난의 대답이 더 낫고 받아 들여진 대답이어야한다고 생각합니다. 하지만 내가 뭔가를 놓치고 있습니까?
acrespo 2013

8

이 솔루션을 시도해보십시오.

    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

이것은 나를 위해 일했습니다.

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","عربى"});
}
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.