Computer >> 컴퓨터 >  >> 프로그래밍 >> Android

Android에서 위치 대신 값으로 스피너(Spinner) 선택 항목 설정하는 방법


이 튜토리얼에서는 Android에서 위치(position)가 아닌 값(value)으로 스피너(Spinner)의 선택 항목을 설정하는 방법을 단계별 예제와 함께 살펴봅니다.

핵심 개념

안드로이드의 Spinner는 기본적으로 setSelection(int position) 메서드를 통해 인덱스 기반으로만 선택 항목을 지정할 수 있습니다. 하지만 실제 개발 환경에서는 서버에서 받아온 데이터나 저장된 사용자 설정처럼 '값'을 기준으로 해당 항목을 선택해야 하는 경우가 훨씬 많습니다.

이럴 때 유용하게 쓸 수 있는 것이 ArrayAdaptergetPosition(String item) 메서드입니다. 이 메서드는 어댑터 목록에서 특정 값의 위치를 찾아 반환하므로, 값을 전달해 원하는 항목을 간편하게 선택할 수 있습니다.

단계별 구현 방법

1단계 — 새 프로젝트 만들기

Android Studio에서 File ⇒ New Project로 이동한 후, 필요한 모든 정보를 입력하여 새 프로젝트를 생성합니다.

2단계 — activity_main.xml 작성

res/layout/activity_main.xml 파일에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:onClick="SelectSpinnerValue"
        android:text="Select Cristiano Ronaldo" />

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button"
        android:layout_centerInParent="true"
        android:layout_marginTop="10dp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:text="Set selected item of Spinner by value instead of by position on Android"
        android:textAlignment="center"
        android:textSize="24sp"
        android:textStyle="bold|italic" />

</RelativeLayout>

3단계 — MainActivity.java 작성

src/MainActivity.java 파일에 아래 코드를 추가합니다. 버튼을 클릭하면 SelectSpinnerValue() 메서드가 호출되어, 어댑터에서 'Cristiano Ronaldo'라는 값의 위치를 찾은 뒤 해당 항목을 선택하도록 구현했습니다.

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    Spinner spinner;
    ArrayAdapter<String> spinnerArrayAdapter;

    String[] footBallPlayers = new String[]{
            "Lionel Messi", "Eden Hazard", "Cristiano Ronaldo",
            "Neymar Jr", "Gareth Bale", "David Bekham"
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        spinner = findViewById(R.id.spinner);

        List<String> playerList = new ArrayList<>(Arrays.asList(footBallPlayers));

        spinnerArrayAdapter = new ArrayAdapter<>(this,
                R.layout.support_simple_spinner_dropdown_item, playerList);
        spinnerArrayAdapter.setDropDownViewResource(R.layout.spinner_value);
        spinner.setAdapter(spinnerArrayAdapter);
    }

    public void SelectSpinnerValue(View view) {
        // 값으로 선택 항목 설정하기
        int position = spinnerArrayAdapter.getPosition("Cristiano Ronaldo");
        if (position != -1) {
            spinner.setSelection(position);
        }
    }
}

참고: 어댑터를 클릭 이벤트 처리 메서드에서도 사용할 수 있도록 필드(멤버 변수)로 선언했다는 점에 주목하세요. 만약 목록에 없는 값을 전달하면 getPosition()은 -1을 반환하므로, 반드시 유효성 검사를 거친 후 setSelection()을 호출하는 것이 안전합니다.

4단계 — 드롭다운 레이아웃 파일 추가

레이아웃 리소스 파일(spinner_value.xml)을 새로 만들고 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textStyle="italic"
    android:fontFamily="sans-serif-medium" />

5단계 — AndroidManifest.xml 설정

androidManifest.xml 파일에 아래 코드를 추가합니다.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

앱 실행하기

이제 애플리케이션을 실행해 보겠습니다. 실제 안드로이드 모바일 기기가 컴퓨터에 연결되어 있다고 가정합니다. Android Studio에서 프로젝트의 액티비티 파일 중 하나를 연 뒤, 툴바의 Run 아이콘을 클릭하세요. 실행 기기로 모바일 기기를 선택하면, 기기 화면에 아래와 같은 결과가 표시됩니다.

Android에서 위치 대신 값으로 스피너(Spinner) 선택 항목 설정하는 방법

마무리

이렇게 ArrayAdapter.getPosition() 메서드를 활용하면 하드코딩된 인덱스에 의존하지 않고, 문자열 값만으로 스피너의 선택 항목을 유연하게 제어할 수 있습니다. 데이터 순서가 바뀌거나 동적으로 항목이 추가·삭제되는 상황에서도 안정적으로 동작하므로, 실무에서 위치 기반 선택보다 훨씬 권장되는 방식입니다.