Spinner

BongKu·2023년 5월 22일

Android

목록 보기
1/30
post-thumbnail

참고. https://developer.android.com/guide/topics/ui/controls/spinner?hl=ko

프로젝트 진행 중 스피너를 활용할 일이 있어 다음과 같이 스피너를 활용해 보았습니다.


1. 스피너 객체를 사용하여 레이아웃에 스피너를 추가합니다.

	.
	.
   <Spinner
        android:id="@+id/notificationTimeSpinner"
        android:layout_width="200dp"
        android:layout_height="30dp"
        android:layout_marginTop="35dp"
        android:background="@drawable/bg_spinner_white_round_10dp"
        app:layout_constraintStart_toEndOf="@id/notificationSpinner1TextView"
        app:layout_constraintTop_toBottomOf="@id/notificationExplanationTextView"
        app:layout_constraintEnd_toEndOf="parent"/>

    .
	.

    <Spinner
        android:id="@+id/notificationPriceSpinner"
        android:layout_width="200dp"
        android:layout_height="30dp"
        android:layout_marginTop="35dp"
        android:background="@drawable/bg_spinner_white_round_10dp"
        app:layout_constraintStart_toEndOf="@id/notificationSpinner1TextView"
        app:layout_constraintTop_toBottomOf="@id/notificationSpinner1TextView"
        app:layout_constraintEnd_toEndOf="parent"/>
	.
	.

2. 사용자 선택 항목으로 스피너 채우기

선택 항목을 사전에 문자열 리소스 파일에 정의합니다.

<resources>
    <string-array name="spiner_time_array">
        <item>1분</item>
        <item>5분</item>
        <item>10분</item>
        <item>30분</item>
        <item>60분</item>
    </string-array>

    <string-array name="spiner_price_array">
        <item>1%</item>
        <item>5%</item>
        <item>10%</item>
        <item>50%</item>
        <item>100%</item>
    </string-array>
</resources>

Activity 또는 Fragment에 ArrayAdapter의 인스턴스를 통해 스피너에 다음과 같이 배열을 제공합니다.

        ArrayAdapter.createFromResource(
            requireContext(),
            R.array.spiner_time_array,
            android.R.layout.simple_spinner_item
        ).also {
            it.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
            binding.notificationTimeSpinner.adapter = it
        }
        ArrayAdapter.createFromResource(
            requireContext(),
            R.array.spiner_price_array,
            android.R.layout.simple_spinner_item
        ).also {
            it.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
            binding.notificationPriceSpinner.adapter = it
        }
   

createFromResource() 메서드를 사용하면 문자열 배열에서 ArrayAdapter를 생성할 수 있습니다. 이 메서드의 세 번째 인수는 선택된 항목이 스피너 컨트롤에 나타나는 방식을 정의하는 레이아웃 리소스입니다. simple_spinner_item 레이아웃은 플랫폼에서 제공하며 스피너의 모양에 관해 자체적인 레이아웃을 직접 정의하고자 하지 않을 경우 사용해야 하는 기본 레이아웃입니다.
그런 다음, setDropDownViewResource(int)를 호출하여 어댑터가 스피너 선택 항목의 목록을 표시하는 데 사용해야 하는 레이아웃을 지정해야 합니다.(simple_spinner_dropdown_item은 플랫폼에서 정의하는 또 다른 표준 레이아웃임).
setAdapter()를 호출하여 어댑터를 Spinner에 적용합니다

3. 사용자 선택에 응답

이벤트 핸들러를 정의하기 위해 AdapterView.OnItemSelectedListener 인터페이스와 콜백 메서드인 onItemSelected()와 onNothingSelected()를 구현합니다.

 binding.run {
            notificationTimeSpinner.onItemSelectedListener =
                object : AdapterView.OnItemSelectedListener {
                    override fun onItemSelected(parent: AdapterView<*>?, view: View?, pos: Int, id: Long) {
                        if (parent != null) {
                            Toast.makeText(
                                requireContext(),
                                parent.getItemAtPosition(pos).toString(),
                                Toast.LENGTH_SHORT
                            ).show()
                        }
                    }

                    override fun onNothingSelected(p0: AdapterView<*>?) {
                        return
                    }
                }
                
            notificationPriceSpinner.onItemSelectedListener =
                object : AdapterView.OnItemSelectedListener {
                    override fun onItemSelected(parent: AdapterView<*>?, view: View?, pos: Int, id: Long) {
                        if (parent != null) {
                            Toast.makeText(
                                requireContext(),
                                parent.getItemAtPosition(pos).toString(),
                                Toast.LENGTH_SHORT
                            ).show()
                        }
                    }

                    override fun onNothingSelected(p0: AdapterView<*>?) {
                        return
                    }
                }
        }

onItemSelected()에 해당 아이템을 클릭했을 때, 처리할 내용들을 구현하면 됩니다.
지금 코드에는 toast 메시지를 띄어주도록 구현했습니다.

profile
화이팅

0개의 댓글