앱에 스피너 추가

스피너는 값 집합에서 하나의 값을 선택할 수 있는 빠른 방법을 제공합니다. 기본 상태에서 스피너는 현재 선택된 값을 표시합니다. 스피너를 탭하면 사용자가 선택할 수 있는 다른 모든 값을 보여주는 메뉴가 표시됩니다.

그림 1. 사용 가능한 값을 보여주는 스피너의 메뉴

Spinner 객체를 사용하여 레이아웃에 스피너를 추가할 수 있습니다. 이 작업은 일반적으로 XML 레이아웃에서 <Spinner> 요소를 사용하여 실행합니다. 예를 들면 다음과 같습니다.

<Spinner
    android:id="@+id/planets_spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

스피너를 선택 목록으로 채우려면 Activity 또는 Fragment 소스 코드에서 SpinnerAdapter를 지정합니다.

Material Design 구성요소를 사용 중인 경우 노출된 드롭다운 메뉴Spinner와 같습니다.

스피너에 사용자 선택 사항 채우기

스피너에 제공하는 선택 항목은 어떤 소스에서든 가져올 수 있지만 SpinnerAdapter를 통해 제공해야 합니다. 예를 들어 선택 항목을 배열에서 사용할 수 있는 경우 ArrayAdapter, 선택 항목을 데이터베이스 쿼리에서 사용할 수 있는 경우 CursorAdapter를 통해 제공해야 합니다.

예를 들어 스피너에 사용 가능한 선택 항목이 미리 결정되면 문자열 리소스 파일에 정의된 문자열 배열을 통해 이러한 선택 항목을 제공할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="planets_array">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
        <item>Mars</item>
        <item>Jupiter</item>
        <item>Saturn</item>
        <item>Uranus</item>
        <item>Neptune</item>
    </string-array>
</resources>

이와 같은 배열을 사용하면 Activity 또는 Fragment에 다음 코드를 사용하여 ArrayAdapter 인스턴스를 사용하는 스피너에 배열을 제공할 수 있습니다.

Kotlin

val spinner: Spinner = findViewById(R.id.planets_spinner)
// Create an ArrayAdapter using the string array and a default spinner layout.
ArrayAdapter.createFromResource(
        this,
        R.array.planets_array,
        android.R.layout.simple_spinner_item
).also { adapter ->
    // Specify the layout to use when the list of choices appears.
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    // Apply the adapter to the spinner.
    spinner.adapter = adapter
}

Java

Spinner spinner = (Spinner) findViewById(R.id.planets_spinner);
// Create an ArrayAdapter using the string array and a default spinner layout.
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
        this,
        R.array.planets_array,
        android.R.layout.simple_spinner_item
);
// Specify the layout to use when the list of choices appears.
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner.
spinner.setAdapter(adapter);

createFromResource() 메서드를 사용하면 문자열 배열에서 ArrayAdapter를 만들 수 있습니다. 이 메서드의 세 번째 인수는 선택된 선택 항목이 스피너 컨트롤에 표시되는 방식을 정의하는 레이아웃 리소스입니다. 플랫폼은 simple_spinner_item 레이아웃을 제공합니다. 스피너의 모양에 자체 레이아웃을 정의하지 않는 한 기본 레이아웃입니다.

setDropDownViewResource(int)를 호출하여 어댑터가 스피너 선택 항목의 목록을 표시하는 데 사용하는 레이아웃을 지정합니다. simple_spinner_dropdown_item는 플랫폼에서 정의하는 또 다른 표준 레이아웃입니다.

setAdapter()를 호출하여 Spinner에 어댑터를 적용합니다.

사용자 선택에 응답

사용자가 스피너의 메뉴에서 항목을 선택하면 Spinner 객체는 항목 선택 시 이벤트를 수신합니다.

스피너의 선택 이벤트 핸들러를 정의하려면 AdapterView.OnItemSelectedListener 인터페이스와 이에 상응하는 onItemSelected() 콜백 메서드를 구현합니다. 예를 들어 다음은 Activity의 인터페이스 구현입니다.

Kotlin

class SpinnerActivity : Activity(), AdapterView.OnItemSelectedListener {
    ...
    override fun onItemSelected(parent: AdapterView<*>, view: View?, pos: Int, id: Long) {
        // An item is selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos).
    }

    override fun onNothingSelected(parent: AdapterView<*>) {
        // Another interface callback.
    }
}

Java

public class SpinnerActivity extends Activity implements OnItemSelectedListener {
    ...
    public void onItemSelected(AdapterView<?> parent, View view,
            int pos, long id) {
        // An item is selected. You can retrieve the selected item using
        // parent.getItemAtPosition(pos).
    }

    public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback.
    }
}

AdapterView.OnItemSelectedListener 인터페이스에는 onItemSelected()onNothingSelected() 콜백 메서드가 필요합니다.

setOnItemSelectedListener()를 호출하여 인터페이스 구현을 지정합니다.

Kotlin

val spinner: Spinner = findViewById(R.id.planets_spinner)
spinner.onItemSelectedListener = this

Java

Spinner spinner = (Spinner) findViewById(R.id.planets_spinner);
spinner.setOnItemSelectedListener(this);

위의 예와 같이 Activity 또는 Fragment를 사용하여 AdapterView.OnItemSelectedListener 인터페이스를 구현하는 경우 this를 인터페이스 인스턴스로 전달할 수 있습니다.