안드로이드

[안드로이드] 스피너(콤보박스) Spinner- Kotlin 구현

디벨로펄 2022. 10. 13.
반응형

다음과 같이 스피너를 구현하고자 한다. 

초기 관계에는 기타를 default로 하며,

다이나믹하게  group 명을 가져올 예정이다.

 

준비물 : Spinner, Spinner에 들어갈 list(xml파일), Adapter

 

1. Layout 구성

먼저, xml파일에 레이아웃을 먼저 구성해준다. id : spinner_group

 

더보기
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:gravity="center"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:gravity="center"
        android:text="@string/relationship"
        android:textColor="@color/black"
        android:textSize="24sp"
        android:textStyle="bold" />

    <EditText
        android:id="@+id/editTVGroup"
        android:layout_width="0dp"
        android:layout_height="60dp"
        android:layout_weight="1"
        android:ems="10"
        android:gravity="center"
        android:inputType="textPersonName"
        android:text="@string/direct" />

    <Spinner
        android:id="@+id/spinner_group"
        android:layout_width="130dp"
        android:layout_height="wrap_content" />

</LinearLayout>

 

2. array 구성 : Spinner 항목

항목 생성 위치

항목은 아래 코드와 같이 작성해준다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="event_array">
        <item>기타</item>
    </string-array>

    <string-array name="group_array">
        <item>기타</item>
        <item>직접 입력</item>
    </string-array>

    <string-array name="route_array">
        <item>현금</item>
        <item>계좌이체</item>
        <item>직접 입력</item>
    </string-array>
</resources>

 

3. SpinnerHandler 생성(명칭은 정확하지 않다.)

안드로이드 documenation을 참고하면 SpinnerActivity를 생성했는데,

Activity를 상속받을 필요는 없어보여 다음과 같이 구성했다.

 

여기서 TextView에 해당하는 부분이 구현상 겹쳐 하나의 attribute으로 구성하였다.

(spinner 선택 시 textView의 text가 바뀌는 방식)

class SpinnerHandler(tv:TextView) : AdapterView.OnItemSelectedListener {
    var textview: TextView=tv
    override fun onItemSelected(parent: AdapterView<*>?, view: View?, pos: Int, id: Long) {
        if (parent != null) {
            textview?.text =parent.getItemAtPosition(pos).toString()
        }
    }

    override fun onNothingSelected(p0: AdapterView<*>?) {
        TODO("Not yet implemented")
    }
}

 

4. 실제 코드에서 Spinner Setting

Fragment에서 불러와 사용했다.

// 경조사 spinner
val eventspinner = binding.spinnerEvent
this.context?.let {
    ArrayAdapter.createFromResource(
        it,
        // spinner에서 보여줄 list
        R.array.event_array,
        // customize된 선택된 친구 설정 가능.
        android.R.layout.simple_spinner_item
    ).also { adapter->
    	// customize된 dropdownView 설정가능.
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        eventspinner.adapter=adapter // 실제로 spinner에 adapter를 적용한다.
    }
}
val eventSpinnerActivity = SpinnerHandler(event)//textView를 인자로 전달.
eventspinner.onItemSelectedListener = eventSpinnerActivity //onItemSelectedListener 전달하여 마무리

Resource라는 단어가 보인다.

해당하는 부분에 customize된 xml을 인자로 넣으면, customize된 Spinner 사용이 가능하다.

R.array.event_array ← 2번째 단계에서 만든 xml파일에서 가져온 array이다.

 

 

전반적으로 Customize, 활용이 간단했다. 

 

궁금하신 점이나 잘못된 점 있으면 댓글 부탁드립니다.

반응형

댓글