본문 바로가기

Android

Android Spinner만들기(Kotlin)

1) activity_main.xml에서 스피너를 등록해준다.

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintWidth_percent="0.7"
        app:layout_constraintDimensionRatio="7:1"
        android:background="@drawable/edittext_round_box"
        app:layout_constraintVertical_bias="0.6"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

 

2) MainActivity.kt파일에 data변수를 만들고 여러 개의 데이터를 입력한다.

val data: List<String> = listOf("1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월")

3) 이제 spinner와 data를 연결해줄 어댑터를 만들어야 한다.

 

ArrayAdapter클래스로 만들고 어댑터에서 사용할 타입을 <제네릭>으로 지정한다.

val adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data)

ArrayAdapter의 파라미터는 총 3개이다.

(스피너를 화면에 그리기 위한 context, 스피너에 보여줄 목록 하나하나가 그려질 레이아웃, 어댑터에서 사용할 데이터)

→ context는 this, 레이아웃은 기본으로 제공하는 simple_list_item1을 사용. 마지막 값으로 미리 만들어둔 data 변수를 입력

 

4) 이후 코드로 생성한 어댑터를 스피너의 adapter속성에 담아주면 간단하게 완성!

spinner.adapter = adapter

 

- 스피너를 선택하면 선택한 값을 TextView에 띄우기 -

 

스피너의 동작을 인식하기 위해서 onItemSelectedListener를 사용한다.

spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            override fun onNothingSelected(p0: AdapterView<*>?) {
            }

            override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
            }
        }

object: AdapterView.OnItemSelectedListener{}까지 입력하고 onNothingSelected, onItemSelected를 오버라이드 해준다. 

OnItemSelecteListener를 사용하는데 이때 p2파라미터는 사용자가 스피너를 선택하면 몇 번째 아이템인지 알려주는 파라미터이다. 

 

override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
     textview_spinner_item.text = data.get(p2)
}

리스너에서 넘겨주는 position값으로 data의 해당 위치에 있는 문자 값을 textview에 입력한다.

 

<전체코드>

class MainActivity : BaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        spinnerTime()

    }

    fun spinnerTime(){
        val data: List<String> = listOf("1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월")
        val adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data)

        spinner.adapter = adapter

        spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            override fun onNothingSelected(p0: AdapterView<*>?) {
            }

            override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
                textview_spinner_item.text = data.get(p2)
            }
        }
    }
}