Devahoy Logo
PublishedAt

Android

สอนวิธีใช้งาน Spinner บน Android

สอนวิธีใช้งาน Spinner บน Android

บทความ Android วันนี้ ขอนำเสนอเรื่อง การทำ Drop-Down Menu ด้วยการใช้ Spinner หลักจากที่พบว่าหลายๆคนมีปัญหาเกี่ยวกับการใช้งาน Spinner กันพอสมควร มีบางคนสอบถามมาว่าสร้างยังไง วันนี้ก็จะมานำเสนอ วิธีทำและตัวอย่างประกอบครับ

ตัวอย่าง Spinner

Spinner

Create Project

เริ่มต้นสร้างโปรเจ็คขึ้นมา

Create Project

Create Project2

Create Project3

Create Project4

หากขึ้นข้อความแบบข้างล่างนี้ เนื่องจาก Android Studio เวอร์ชันล่าสุด เปลี่ยนไปใช้ Gradle Plugin เวอร์ชั่น 0.13 ซึ่งมัน required Gradle เวอร์ชัน 2.1 หากเครื่องเราไม่มี มันก็จะทำการเตือน กด OK เพื่ออัพเดท Gradle ครับ

Gradle SYnc

สังเกตที่ไฟล์ build.gradle ในส่วน Root Project ต้องเป็นดังนี้

build.gradle

1
// Top-level build file where you can add configuration options common to all sub-projects/modules.
2
3
buildscript {
4
...
5
dependencies {
6
classpath 'com.android.tools.build:gradle:0.13.0'
7
}
8
}
9
...

อีกไฟล์นึงคือ gradle/gradle-wrapper.properties ดูว่า เวอร์ชัน 2.1 ถูกต้องหรือไม่

1
...
2
distributionUrl=http\://services.gradle.org/distributions/gradle-2.1-all.zip

หากมีปัญหา ในการสร้างโปรเจ็ค ก็ให้ใช้เวอร์ชันลอง Gradle Plugin และ Gradle ตามด้านบนเลยครับ

Spinner คืออะไร ?

Spinner เป็น View หรือ Widget ตัวหนึ่งของ Android ที่เอาไว้แสดงเมนูรายชื่อ แบบ Drop-Down

ขั้นตอนการสร้าง Spinner มีดังนี้

  1. สร้าง Spinner ในไฟล์ xml และทำการเชื่อมกับส่วนของโค๊ด

  2. กำหนดลิสต์ข้อมูลที่ต้องการขึ้นมา

  3. สร้าง Adapter โดยใช้ข้อมูลจากข้อ 2 และเลเอาท์ที่ต้องการ อย่างในตัวย่าง จะใช้ ArrayAdapter และเลเอาท์ที่แสดง ก็เป็น default ของ android นั่นก็คือ android.R.layout.simple_dropdown_item_1line

  4. setAdapter ให้กับ Spinner จากข้อ 1 โดยใช้ Adapter จากข้อ 3

เริ่มต้นสร้าง Spinner

การสร้าง Spinner คล้ายๆกับการทำ ListView ซึ่งจำเป็นต้องมี ข้อมูล ตัวข้อมูลที่เราต้องการให้มาแสดงใน Spinner สามารถสร้างได้โดยการกำหนดเป็น Array ในโปรแกรม หรือว่ากำหนดเป็น string-array ในไฟล์ strings.xml ก็ได้ อีกคลาสที่ใช้ในการทำ Spinner ก็คือตัว Adapter อาจจะเป็น ArrayAdapter หรือว่าเป็น CursorAdapter ที่ไว้สำหรับดึงข้อมูลมาจากฐานข้อมูล

เริ่มต้นเปิดไฟล์ activity_my.xml ขึ้นมาครับ ทำการสร้าง Spinner ขึ้นมาสองตัว ดังนี้

1
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2
android:layout_width="match_parent"
3
android:layout_height="match_parent"
4
android:padding="32dp"
5
android:orientation="vertical">
6
7
<Spinner android:layout_width="wrap_content"
8
android:layout_height="wrap_content"
9
android:id="@+id/english_club">
10
11
</Spinner>
12
13
<Spinner android:layout_width="wrap_content"
14
android:layout_height="wrap_content"
15
android:layout_marginTop="16dp"
16
android:id="@+id/thai_club">
17
18
</Spinner>
19
20
</LinearLayout>

ตัวอย่าง จะทำการสร้าง Spinner ขึ้นมาสองตัว ตัวแรก เป็นรายชื่อสโมสรฟุตบอลของไทย จะสร้างแบบ ArrayList ในโปรแกรม และตัวที่สอง เป็นรายชื่อสโมสรฟุตบอลของอังกฤษ จะสร้างด้วย string-array ในไฟล์ strings.xml

เปิดไฟล์ MyActivity.java ขึ้นมา ทำการเชื่อม Spinner ในโค๊ดกับ Layout และกำหนด ArrayList ดังนี้

1
package com.devahoy.android.spinnerdemo;
2
3
import android.app.Activity;
4
import android.os.Bundle;
5
import android.widget.Spinner;
6
7
import java.util.ArrayList;
8
9
10
public class MyActivity extends Activity {
11
12
private Spinner mEnglishSpinner;
13
private Spinner mThaiSpinner;
14
15
private ArrayList<String> mThaiClub = new ArrayList<String>();
16
17
@Override
18
protected void onCreate(Bundle savedInstanceState) {
19
super.onCreate(savedInstanceState);
20
setContentView(R.layout.activity_my);
21
22
mEnglishSpinner = (Spinner) findViewById(R.id.english_club);
23
mThaiSpinner = (Spinner) findViewById(R.id.thai_club);
24
25
createThaiClubData();
26
}
27
28
private void createThaiClubData() {
29
30
mThaiClub.add("Air Force Central");
31
mThaiClub.add("Army United");
32
mThaiClub.add("Bangkok Glass");
33
mThaiClub.add("Bangkok United");
34
mThaiClub.add("BEC Tero");
35
mThaiClub.add("Buriram United");
36
mThaiClub.add("Chainat Hornbill");
37
mThaiClub.add("Chiangrai United");
38
mThaiClub.add("Chonburi");
39
mThaiClub.add("Muangthong United");
40
mThaiClub.add("Osotspa Saraburi");
41
mThaiClub.add("Police United");
42
mThaiClub.add("PTT Rayong");
43
mThaiClub.add("Ratchaburi");
44
mThaiClub.add("Samut Songkhram");
45
mThaiClub.add("Singhtarua");
46
mThaiClub.add("Sisaket");
47
mThaiClub.add("Songkhla United");
48
mThaiClub.add("Supanburi");
49
mThaiClub.add("TOT Bangkok");
50
51
}
52
}
  • mThaiSpinner : คือ Spinner ที่จะแสดงรายชื่อสโมสรไทย
  • mEnglishSpinner : คือ Spinner ที่จะแสดงรายชื่อสโมสรอังกฤษ
  • mThaiClub : คือ ArrayList ข้อมูลสโมสรไทย

สร้างข้อมูลด้วย string-array

ต่อมาทำการสร้างข้อมูลให้กับ Spinner ของสโมสรอังกฤษบ้าง โดยการเพิ่ม string-array ในไฟล์ res/values/strings.xml ดังนี้

1
<string-array name="club">
2
<item>Arsenal</item>
3
<item>Aston Villa</item>
4
<item>Burnley</item>
5
<item>Chelsea</item>
6
<item>Crystal Palace</item>
7
<item>Everton</item>
8
<item>Hull City</item>
9
<item>Leicester City</item>
10
<item>Liverpool</item>
11
<item>Manchester City</item>
12
<item>Manchester United</item>
13
<item>Newcastle United</item>
14
<item>Queens Park Rangers</item>
15
<item>Southampton</item>
16
<item>Stoke City</item>
17
<item>Sunderland</item>
18
<item>Swansea City</item>
19
<item>Tottenham Hotspur</item>
20
<item>West Bromwich Albion</item>
21
<item>West Ham United</item>
22
</string-array>

ขั้นตอนต่อไป สร้าง ArrayAdapter ขึ้นมาสองตัว ตัวแรก ใช้ข้อมูล mThaiClub ตัวที่สอง ใช้ข้อมูลจาก strings.xml ดังนี้

1
@Override
2
protected void onCreate(Bundle savedInstanceState) {
3
super.onCreate(savedInstanceState);
4
setContentView(R.layout.activity_my);
5
6
mEnglishSpinner = (Spinner) findViewById(R.id.english_club);
7
mThaiSpinner = (Spinner) findViewById(R.id.thai_club);
8
9
createThaiClubData();
10
11
// Adapter ตัวแรก
12
ArrayAdapter<String> adapterThai = new ArrayAdapter<String>(this,
13
android.R.layout.simple_dropdown_item_1line, mThaiClub);
14
mThaiSpinner.setAdapter(adapterThai);
15
16
17
// Adapter ตัวที่สอง
18
String[] englishClub = getResources().getStringArray(R.array.club);
19
ArrayAdapter<String> adapterEnglish = new ArrayAdapter<String>(this,
20
android.R.layout.simple_dropdown_item_1line, englishClub);
21
mEnglishSpinner.setAdapter(adapterEnglish);
22
}

ตัว simple_dropdown_item_1line เป็นเลเอาท์ default ของทาง Android นะครับ เมื่อทดสอบรันโปรแกรม จะได้หน้าตาดังนี้

Spinner Demo

ส่วน layout ของ Spinner เราก็สามารถเปลี่ยนได้นะ ลองใช้ simple_spinner_item แทน จะได้ item list ที่ช่องไฟเล็กลง ดังนี้

Spinner Item

สุดท้าย เมื่อได้ Spinner แล้ว ต่อไปก็ใส่ Listener ให้มัน ตัว Spinner จะใช้ setOnItemSelectedListener() เพื่อส่ง Listener เมื่อเราทำการเลือกไอเท็มใน Spinner โดยตัว setOnItemSelectedListerner() จะรับ interface AdapterView.OnItemSelectedListener() ดังนี้

1
// setOnItemSelectedListener
2
mThaiSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
3
@Override
4
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
5
Toast.makeText(MyActivity.this,
6
"Select : " + mThaiClub.get(position),
7
Toast.LENGTH_SHORT).show();
8
}
9
10
@Override
11
public void onNothingSelected(AdapterView<?> parent) {
12
13
}
14
});
15
mEnglishSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
16
@Override
17
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
18
Toast.makeText(MyActivity.this,
19
"Select : " + englishClub[position],
20
Toast.LENGTH_SHORT).show();
21
}
22
23
@Override
24
public void onNothingSelected(AdapterView<?> parent) {
25
26
}
27
});

Spinner Listener

Custom Spinner with Custom Adapter

ตัวอย่างนี้จะทำการสร้าง Custom Spinner โดยใช้ Custom Adapter (คล้ายกับการทำ Custom ListView) เพื่อทำให้ Drop Down ของเรา โชว์รูปภาพ และข้อความด้วย

วิธีการก็คือ เริ่มต้นสร้าง Custom Adapter ขึ้นมาก่อน หากใครไม่รู้จัก Custom Adapter อ่านบทความนี้ประกอบครับ วิธีการทำ Custom ListView

สร้างไฟล์ list_item_adapter.xml ดังนี้ ใน หนึ่งแถวมี ImageView และ TextView

1
<?xml version="1.0" encoding="utf-8"?>
2
3
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
4
android:orientation="horizontal"
5
android:layout_width="match_parent"
6
android:padding="16dp"
7
android:layout_height="match_parent">
8
9
<ImageView android:layout_width="32dp"
10
android:layout_height="32dp"
11
android:src="@drawable/ic_launcher"
12
android:layout_gravity="center"
13
android:id="@+id/logo"/>
14
15
<TextView android:layout_width="match_parent"
16
android:layout_height="wrap_content"
17
android:text="Title"
18
android:layout_marginLeft="16dp"
19
android:layout_gravity="center"
20
android:id="@+id/name"/>
21
22
</LinearLayout>

สร้างไฟล์ CustomAdapter.java ขึ้นมาดังนี้

1
package com.devahoy.android.spinnerdemo;
2
3
import android.content.Context;
4
import android.view.LayoutInflater;
5
import android.view.View;
6
import android.view.ViewGroup;
7
import android.widget.BaseAdapter;
8
import android.widget.ImageView;
9
import android.widget.TextView;
10
11
import java.util.ArrayList;
12
13
public class CustomAdapter extends BaseAdapter {
14
15
private Context mContext;
16
private ArrayList<String> mData;
17
private LayoutInflater mInflater;
18
19
public CustomAdapter(Context context, ArrayList<String> data) {
20
mInflater = LayoutInflater.from(context);
21
mContext = context;
22
mData = data;
23
}
24
@Override
25
public int getCount() {
26
return mData.size();
27
}
28
29
@Override
30
public Object getItem(int position) {
31
return mData.get(position);
32
}
33
34
@Override
35
public long getItemId(int position) {
36
return position;
37
}
38
39
@Override
40
public View getView(int position, View convertView, ViewGroup parent) {
41
ViewHolder holder;
42
43
if (convertView == null) {
44
holder = new ViewHolder();
45
convertView = mInflater.inflate(R.layout.list_item_adapter, parent, false);
46
holder.name = (TextView) convertView.findViewById(R.id.name);
47
holder.logo = (ImageView) convertView.findViewById(R.id.logo);
48
} else {
49
holder = (ViewHolder) convertView.getTag();
50
}
51
52
int imgResourceId;
53
switch (position) {
54
case 0:
55
imgResourceId = android.R.drawable.ic_menu_share;
56
break;
57
case 1:
58
imgResourceId = android.R.drawable.ic_menu_call;
59
break;
60
case 2:
61
imgResourceId = android.R.drawable.ic_menu_camera;
62
break;
63
case 3:
64
imgResourceId = android.R.drawable.ic_menu_search;
65
break;
66
default:
67
imgResourceId = android.R.drawable.ic_menu_zoom;
68
break;
69
}
70
71
holder.name.setText(mData.get(position));
72
holder.logo.setImageResource(imgResourceId);
73
74
convertView.setTag(holder);
75
76
return convertView;
77
}
78
79
public class ViewHolder {
80
TextView name;
81
ImageView logo;
82
}
83
}

โค๊ดด้านบน สร้าง CustomAdapter ขึ้นมา โดยที่ให้โหลดรูป จาก android.R.drawable โดยการใช้ switch case เพื่อแสดงโลโก้ และแสดงชื่อเมนู จาก ArrayList<String>

กลับมาที่ไฟล์ activity_my.xml ทำการเพิ่ม Spinner เข้ามาอีกตัว

1
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2
android:layout_width="match_parent"
3
android:layout_height="match_parent"
4
android:padding="32dp"
5
android:orientation="vertical">
6
7
<Spinner android:layout_width="match_parent"
8
android:layout_height="wrap_content"
9
android:id="@+id/english_club">
10
11
</Spinner>
12
13
<Spinner android:layout_width="match_parent"
14
android:layout_height="wrap_content"
15
android:layout_marginTop="16dp"
16
android:id="@+id/thai_club">
17
18
</Spinner>
19
20
<Spinner android:layout_width="match_parent"
21
android:layout_height="wrap_content"
22
android:layout_marginTop="16dp"
23
android:id="@+id/spinner_menu">
24
25
</Spinner>
26
27
</LinearLayout>

คลาส MyActivity.java ทำการสร้าง Spinner ขึ้นมา โดยใช้ CustomAdapter ที่ได้สร้างไว้ พร้อมกับ ArrayList<String> ดังนี้

1
// Spinner with CustomAdapter
2
Spinner spinnerMenu = (Spinner) findViewById(R.id.spinner_menu);
3
ArrayList<String> data = new ArrayList<String>();
4
for (int i = 1; i <= 5; i++) {
5
data.add("Menu#" + i);
6
}
7
8
CustomAdapter customAdapter = new CustomAdapter(this, data);
9
spinnerMenu.setAdapter(customAdapter);

ทดสอบรันโปรแกรม ผลลัพธ์เป็นดังนี้

Custom Spinner

สุดท้าย ก็ลองไปประยุกต์ใช้งานกันดูนะครับ มีพวกการโหลดข้อมูลมาใส่ Spinner โดยดึงข้อมูลมาจาก SQLite หรือว่าจะเป็นการรับข้อมูลมาจาก Web Service ต่างๆ เป็นต้น สำหรับบทความนี้ก็ยกตัวอย่างมาพอสมควรแล้ว ทีเหลือก็ขึ้นอยู่กับผู้อ่าน นำไปประยุกต์ใช้งานแล้วละครับ ขอให้โชคดี Happy Coding

Authors
avatar

Chai Phonbopit

เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust

Related Posts