Android

안드로이드 Android Spinner 사용방법 예제코드 포함(콤보박스)

Android Spinner 사용방법

안드로이드 스피너를 사용해보자. 스피너는 콤보박스로 생각하면 된다. 스피너는 대부분 조회 조건을 생성하거나 입력받아야할 데이터가 있을 때 사용하면 된다. 즉 한정된 공간을 활용하여 여러 문자열을 보여줄 수 있음으로 다양한 용도로 사용된다. 스피너는 하나의 어레이어댑터가 필요하다. 어레이 어댑터(ArrayAdapter)를 하나 선언한 후 그것을 스피너의 setAdapter메소드를 사용하여 적용해주어야 하는 구조로 이루어져있다. 그럼 예제를 살펴보자.

■res/layout/activity_spiner.xml은 시피너를 구성하는 레이아웃이다. Spinner를 하나 추가해주었다. 팔레트에서 스피너를 레이아웃으로 드래그하여 추가하여도 된다. 아래 샘플은 xml 코드단에서 추가되었다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/title_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white"
        android:gravity="center"
        android:orientation="horizontal">

        <Spinner
            android:id="@+id/spinner1"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:spinnerMode="dropdown" />
    </LinearLayout>
</RelativeLayout>

spinnerMode 속성은 스피너에 설정된 문자열을 어떻게 보여줄지 지정한다. 선택할 수 있는 속성으로 드롭다운(dropdown)과 다이얼로그(dialog) 이렇게 2가지를 지원한다. 드롭다운은 문자열이 위에서 아래로 펼쳐지면서 보여준다. 다이얼로그 모드는 문자열을 화면 중앙에 보이도록 한다. activity_spiner.xml 상에 속성은 지정하지 않았지만 다롭다운, 즉 리스트가 보이는 화면의 배경색을 설정할 수 있다. popupBackgroud 속성을 사용하면 된다.

android:popupBackgroud="#FFFFFF" 

■SpinerActivity.class 내용은 다음과 같다. 기본적으로 제공하는 simple_spinner_item.xml 레이아웃을 사용하였다. 단점은 스피너 아이템의 색상 변경이 불가능하다. 색상이나 글씨 크기 등의 변경이 필요한 경우 사용자 정의 layout을 신규로 생성하여 적용하여야한다.

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class SpinerActivity extends AppCompatActivity {

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

        final String[] country = {"-국가 선택-","한국", "미국", "독일", "중국", "일본", "스페인"};

        Spinner spiner = (Spinner) findViewById(R.id.spinner1);

        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, country);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);        
        spiner.setAdapter(adapter);

        spiner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
                Toast.makeText(getApplicationContext(), "Selected Country: "+categories[position] , Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

    }

}

setOnItemSelectedListener메소드를 사용하여 스피너에서 아이템을 선택하였을 때 실행할 코드를 작성할 수 있다.  위 코드에서는 선택된 아이템에 대해하여 토스트메세지를 보여주도록 하였다. 코드상에서 콤보박스에 넣을 국가 정보에 대해 자료형으로 문자형 배열로 선언하였다. 아래 예시와 같이 ArrayList를 사용하여도 된다.

// Spinner Drop down elements
List<String> categories = new ArrayList<String>();
categories.add("-국가 선택-");
categories.add("한국");
categories.add("미국");

만약 데이터베이스를 사용한다면 데이터를 조회 후 ArrayList에 담는 방법도 있다. 데이터 받아와서 For문을 돌려 List에 담으면 되니 문제될 건 없다. 스피너에 필요한 문자열이 고정된 값이라면 values/array.xml  파일을 하나 추가 후 배열값을 가져와 적용하여도 된다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="country_array">
        <item>한국</item>
        <item>미국</item>
        <item>독일</item>
        <item>영국</item>
        <item>이탈리아</item>
    </string-array>
</resources>
Spinner spinner = (Spinner) findViewById(R.id.spinner1); 

//문자열 배열과 기본 스피너 레이아웃을 사용하여 ArrayAdapter 만들기
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        R.array.country_array, android.R.layout.simple_spinner_item);

//선택 목록이 나타날 때 사용할 레이아웃을 지정
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

//스피너에 어댑터 적용
spinner.setAdapter(adapter);

스피너(콤보박스)에 특정 값으로 초기값으로 고정하고 싶다면 setSelection메소드를 사용하면 된다.

spiner.setSelection(2); //position 값을 지정한다.

■ 스피너 선택값 가져오는 방법

spiner.getSelectedItem().toString();

■AndroidManifest.xml  기본 매니페스트 정보

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.gugudan">

    <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=".SpinerActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

■실행결과

안드로이드 스튜디오에서 Run ‘app’ 아이콘 버튼을 클릭하여 실행한다. 단축키는 Shift + F10 이다.

휴대폰을 USB통하여 연결하거나 에뮬레이터를 통하여 실행할 수 있다. 예전에 비해 요즘 에뮬레이터 실행 속도가 굉장히 좋아졌다. 예전에는 느려서 도저히 에뮬레이터를 사용할 수 없었다. 제조사 운영체제별로 제공되는 기능이 있다면 얼마나 좋을까? 테스트 폰 구입하는 비용이 부담이 된다.

시피너에 보여줄 문자가 많은 경우 드롭다운 리스트가 굉장히 길어져 화면 위와 아래를 가득 채우는 경우가 발생한다. 조금은 뭔가 언발란스해보인다. 드롭다운이니까 아래쪽으로만 보여줘야하는데…. 화면을 덮어 위아래로 나타나는 경향이 있다.

■ 스피너에 대한 상세한 정보는 개발자 문서를 참고 하자. Spinner

참고 자료 : 스피너 구글 문서

Spinner  |  Android 개발자  |  Android Developers

Spinner는 값 집합에서 하나의 값을 선택할 수 있는 빠른 방법을 제공합니다. 기본 상태의 Spinner는 현재 선택된 값을 표시합니다. Spinner를 터치하면 기타 모든 사용 가능한 값을 포함하는 드롭다운

developer.android.com

다음에는 스피너 레이아웃을 내가 원하는 스타일로 변경하는 방법에 대해 알아보자.

Leave a Reply

error: Content is protected !!