Spinner는 같이 드롭다운 형태로 여러 선택지 중 사용자가 원하는 아이템 하나를 고르게 하고 싶을 때 사용하는 위젯이다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Spinner
android:id="@+id/spinner"
android:layout_width="200dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Spinner에 들어가는 데이터는 두가지 방식으로 만들 수 있다.
첫번째는 코틀린 코드에서 배열을 이용해 데이터를 추가해주는 방식이다.
아래와 같이 배열에 데이터를 담아준다.
var data = listOf<String>("1", "2", "3", "4", "5")
두번째는 xml파일을 이용해 데이터를 추가해주는 방식이다.
프로젝트의 resource
폴더에 새로운 xml파일을 만들고 다음과 같이 데이터를 추가해줄 수 있다.
<resources>
<string-array name="data">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
</string-array>
</resources>
Spinner는 RecyclerView와 같이 Container를 사용하는 View이다.
그렇기 때문에 Adapter를 이용해 구현을 해주어야 한다.
다음과 같이 Adapter를 생성해줄 수 있다.
이때 xml을 이용해 생성한 데이터를 연결해주고 싶다면 data
를 R.array.array이름
으로 변경해주면 된다.
val adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data)
val spinner: Spinner = findViewById(R.id.spinner)
spinner.adapter = adapter
Spinner에 사용되는 Adapter는 다음 세가지 파라미터를 전달 받는다.
위 단계까지는 Spinner를 Activity에 보여주는 역할을 한다.
하지만 사용자가 어떤 항목을 선택했는지 앱에서 알기 위해서는 Listener가 필요하다.
Spinner의 Listener는 다음과 같이 만들어 줄 수 있다.
spinner.onItemSelectedListener =
object: AdapterView.OnItemSelectedListener {
override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
Toast.makeText(this@MainActivity, p0!!.getItemAtPosition(p2).toString(), Toast.LENGTH_SHORT).show()
}
override fun onNothingSelected(p0: AdapterView<*>?) {
TODO("Not yet implemented")
}
}
여기서 override된 함수인 onItemSelected
는 Spinner의 Item이 선택되었을때의 event를 처리해주는 함수이고 onNothingSelected
는 아무것도 선택되지 않았을 때의 event를 처리해주는 함수이다.
https://github.com/kang9366/Android-Study/tree/main/Android_Spinner