[Android] Spinner

강승구·2023년 4월 25일
0

Spinner는 같이 드롭다운 형태로 여러 선택지 중 사용자가 원하는 아이템 하나를 고르게 하고 싶을 때 사용하는 위젯이다.

사용법

1. xml 파일에 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>

2. Spinner에 들어갈 데이터 만들기

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>

3. Spinner와 데이터를 Adapter로 연결

Spinner는 RecyclerView와 같이 Container를 사용하는 View이다.
그렇기 때문에 Adapter를 이용해 구현을 해주어야 한다.

다음과 같이 Adapter를 생성해줄 수 있다.
이때 xml을 이용해 생성한 데이터를 연결해주고 싶다면 dataR.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는 다음 세가지 파라미터를 전달 받는다.

  • current context
  • layout
  • data

4. Spinner의 동작을 감지하는 Listener 생성

위 단계까지는 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

profile
강승구

0개의 댓글