안드로이드 여러 아이템 중에서 하나를 선택하는 전형적인 위젯으로 스피너(Spinner)가 있다.
스피너는 윈도우에서의 콤보박스처럼 누르면 아래에 작은 창이 나타나고 그 안의 여러 데이터 중 하나를 선택하도록 되어있다.
스피너는 <Spinner>
태그를 사용해 XML 레이아웃에 추가한 후 사용할 수 있다.
activity_main.xml 에 TextView와 Spinner를 하나씩 넣었다.
MainActivity.java 파일을 수정한다.
public class MainActivity extends AppCompatActivity {
TextView textView;
String[] items = {"AAA", "BBB", "CCC", "DDD", "EEE", "FFF", "GGG", "HHH"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
Spinner spinner = findViewById(R.id.spinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
textView.setText(items[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
textView.setText("");
}
});
}
}
스피너 객체로 전달할 어댑터 객체를 API에서 제공하는 기본 어댑터를 이용해 만들었다.
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
여기서 사용한 어댑터는 ArrayAdapter로 배열이 된 아이템으로 추가할 때 사용한다.
첫 번째 파라미터는 Contex 객체이므로 액티비티인 this를 전달하였다.
두 번째 파라미터는 뷰를 초기화할 때 사용되는 XML 레이아웃의 리소스 ID 값으로 API에서 제공하는 레이아웃인 simple_spinner_item을 전달하였다. 이 레이아웃은 문자열을 아이템으로 보여주는 단순 스피너 아이템의 레이아웃이다.
세 번째 파라미터는 아이템으로 보일 문자열의 데이터들의 배열이다. 변수로 정의한 items을 전달하였다.
setDropDownViewResource 메소드는 스피너의 각 아이템들을 보여줄 뷰에 사용되는 레이아웃을 지정하는 데 사용된다.
안드로이드에서 미리 정의한 리소스인 simple_spinner_dropdown_item을 전달하였다.
마지막으로 스피너 객체가 이이템 선택 이벤트를 처리 할 수 있도록 OnItemSelectedListener를 설정하였다.
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
textView.setText(items[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
textView.setText("");
}
});