들어가기 전에
스피너는 보통 콤보박스라고 불리는 위젯입니다.
한 항목 당 글자 하나만을 보여주는 경우가 많고 가끔 이미지와 글자가 함께 보이거나 여러 개의 글자가 보이기도 합니다.
여러 개의 항목 중에서 하나를 선택하는 방식은 앞에서 만들어보았던 리스트뷰와 같습니다.
즉, 선택 위젯에 해당하며 어댑터를 사용해서 만들게 됩니다.
그런데 한 아이템으로 보이는 것이 텍스트 하나인데도 각각의 아이템을 위한 뷰를 별도로 만들어야 할까요?
한 아이템이 텍스트 하나인 경우를 위해 좀 더 간단한 방식을 사용할 수 있습니다.
스피너를 어떻게 만들어 사용하는지 알아봅시다.
학습 목표
- 스피너가 동작하는 방식을 이해해봅시다
- 스피너를 화면에 보여주기 위해서는 어떤 것들을 만들어야 하는지 설명해봅시다.
핵심 단어
학습하기
스피너 (Spinner)
스피너를 위해 SDK에서 미리 제공하는 레이아웃이 있습니다. 각 아이템을 위한 레이아웃을 미리 만들어둔 것이죠.
그런데 스피너는 이미 선택된 아이템이 보이는 뷰와 아이템을 선택하기 위해 보이는 뷰가 서로 다릅니다.
따라서 두 개의 뷰가 있어야 합니다.
이를 위해 setDropDownResource라는 메소드를 이용해 아이템을 선택하기 위해 보이는 뷰의 레이아웃을 설정해줍니다.
SDK에서 미리 만들어 제공하는 레이아웃을 사용하면 몇 줄의 코드만으로도 스피너를 만들 수 있습니다.
스피너 만들기
스피너는 <Spinner> 태그를 이용해 XML 레이아웃에 추가하고 어댑터 객체를 만들어 설정합니다.
스피너에 들어가는 각 아이템은 복잡한 레이아웃을 사용하지 않고 텍스트뷰 하나만 보여주는 경우가 많아서 안드로이드 SDK에서 미리 제공하는 XML 레이아웃을 그대로 사용할 수 있습니다.
ArrayAdapter는 아이템을 위한 여러 개의 데이터를 담아두기 위해 미리 만들어진 것이며 android.R.layout.simple_spinner_item 은 하나의 아이템을 위해 미리 만들어진 레이아웃입니다.
다만 스피너는 항목을 선택하기 위한 창이 별도로 있기 때문에 setDropDownViewResource 메소드를 이용해 별도 창에 보이는 각 아이템을 위한 레이아웃을 별도로 설정합니다.
Spinner 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);
생각해보기
- 스피너도 리스트뷰를 만들 때처럼 어댑터를 직접 만들어 설정할 수 있을까요?
- 스피너의 한 항목에 보이는 뷰가 이미지 하나와 텍스트뷰 하나가 되도록 만들 수도 있을까요?
참고 자료
comment
⭐️생각해보기⭐️
1. 네 setAdapter 메소드 안에 사용자 정의한 어댑터를 만들 수 있을 듯 합니다.
2.네 하지만 ArrayAdater를 수정해야합니다.
앱을 처음 실행시켰을 때 onNothingSelected에 설정한 "선택: "이 뜨지 않고 첫 번째 항목인 "소녀시대"가 뜨는 이유는 무엇인가요?
생각해보기
1. 네 가능합니다. 위 예제처럼 String 하나만 넣는 단순한 경우에만 ArrayAdapter와 같은 이미 있는 API를 사용하는 것 같습니다.
2. 직접 지정한 adapter를 사용한다면, list view 예제에서 했듯이 자료객체를 만들고 적용한다면 가능할 것 같습니다.
1. 네.
2. 1번 질문이랑 연관되어있는 질문인것 같습니다. 리스트뷰 강의에서 했던 것처럼 이미지 하나와 텍스트뷰 하나가 들어가 있는 하나의 아이템 객체 틀을 만들어서 직접 어탭터를 만들어 적용하는 방식으로 하면 될 것 같습니다.