הכרנו כבר כמה מחלקות (classes) של widget, נזכיר את Button, EditText, TextView, ListView. נכיר עכשיו ווידג'ט חשוב נוסף: Spinner המוכר לפעמים במקומות אחרים כ-pull-down או תפריט גלילה. התפריט הזה מאפשר בחירה ע"י לחיצה וגלגול.
נבצע ונסביר תרגיל הכולל spinner. מטרת התרגיל: בחירה של שיר מתוך רשימת שירים.
הקלק על הלינק להורדת קבצי המקור.
הקלק על הלינק להורדת קבצי המקור.
נתחיל מהסוף: ה-UI מוצג בתמונה הבאה:
בתצוגה הנ"ל מופיעים 4 אלמנטים (מלמעלה למטה):
- TextView עם הכותרת של ה-spinner
- ה-spinner
- כפתור להחלת הבחירה של ה-spinner (זאת העדפה שלי, אפשר לבצע בחירה ב-spinner גם ללא התניה בכפתור נוסף)
- TextView להצגת הבחירה.
כעת כשמטרת התרגיל ידועה, נסקור את קבצי הקוד.
נתחיל עם ה-layout:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView android:id="@+id/spinnerTitle"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/spinner_title"
- android:layout_marginTop="30px" android:layout_marginBottom="20px"
- android:layout_marginLeft="40px"
- />
- <Spinner android:id="@+id/songs_spinner"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20px"
- />
- <Button android:id="@+id/apply_button"
- android:text="@string/apply"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="20px"
- />
- <TextView android:id="@+id/output_box"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="30px" android:layout_marginBottom="20px"
- android:layout_marginLeft="20px"
- />
- </LinearLayout>
ארבעת האלמנטים של התצוגה אותם ראינו מופיעים כאן. שימו לב ל-spinner - שורה 14. songs_spinner מתייחס ל-id שלו, ובאמצעותו, כרגיל, נוכל להתייחס לאלמנט זה, כפי שנראה מיד. עד כאן ה-layout.
ה-spinner כאמור כולל רשימה של שירים. אפשר היה ליצר רשימה זו בתוך קובץ ה-java, כמו שנעשה בתרגיל של ה-ListView. מצד שני, שימוש ברשימה שנמצאת בקובץ נתונים מאפשרת הוספת או הורדת פריטים מהרשימה מבלי לגעת בקובץ java וזה בהחלט עדיף. היות שכך, את רשימת השירים נחזיק בקובץ res/values/array.xml, ובתוכו מערך בשם songsArray. לשם הנוחות תוכן הקובץ מוצג כאן:
מעבר לקובץ ה-layout וה-array שהוצגו למעלה, שאר הקבצים די סטנדרטים (למשל strings.xml), כך שנוכל התרכז בעיקר - mySpinner.java.
הפעם מדובר בתרגיל פשוט, האובייקט mySpinner מכיל מתודה אחת בלבד - onCreate.
כרגיל, נציג תחילה את האובייקט כולו ואח"כ נסביר אותו.
התהליכים במתודה onCreate:
שלב 1. האיתחולים הרגילים: קריאה למתודת ה"אב" (super), ואתחול ה-UI בשורות 8-9.
שלב 2. הבאת 3 הווידג'טים על פי ה-id שלהם:
ה-spinner כאמור כולל רשימה של שירים. אפשר היה ליצר רשימה זו בתוך קובץ ה-java, כמו שנעשה בתרגיל של ה-ListView. מצד שני, שימוש ברשימה שנמצאת בקובץ נתונים מאפשרת הוספת או הורדת פריטים מהרשימה מבלי לגעת בקובץ java וזה בהחלט עדיף. היות שכך, את רשימת השירים נחזיק בקובץ res/values/array.xml, ובתוכו מערך בשם songsArray. לשם הנוחות תוכן הקובץ מוצג כאן:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <array name="songsArray">
- <item>Valentino</item>
- <item>Yesterday</item>
- <item>My Way</item>
- <item>The Boxer</item>
- <item>American Pie</item>
- <item>Niddles and Pins</item>
- <item>Indian Summer</item>
- <item>Knowing Me Knowing You</item>
- <item>Rasputin</item>
- <item>Elinor</item>
- </array>
- </resources>
מעבר לקובץ ה-layout וה-array שהוצגו למעלה, שאר הקבצים די סטנדרטים (למשל strings.xml), כך שנוכל התרכז בעיקר - mySpinner.java.
הפעם מדובר בתרגיל פשוט, האובייקט mySpinner מכיל מתודה אחת בלבד - onCreate.
כרגיל, נציג תחילה את האובייקט כולו ואח"כ נסביר אותו.
- public class mySpinner extends Activity {
- /** Called when the activity is first created. */
- private Spinner songSelectSpinner;
- private Button applyButton;
- private TextView textBox;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.setContentView(R.layout.main);
- songSelectSpinner = (Spinner) findViewById(R.id.songs_spinner);
- textBox = (TextView)findViewById(R.id.output_box);
- applyButton = (Button)findViewById(R.id.apply_button);
- ArrayAdapter<String> songsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, getResources()
- .getStringArray(R.array.songsArray));
- songSelectSpinner.setAdapter(songsAdapter);
- applyButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- String selectedSong = getResources().getStringArray(R.array.songsArray)[songSelectSpinner.getSelectedItemPosition()];
- textBoxox.setText("Selected song is: " + selectedSong);
- }
- });
- }
- }
שלב 1. האיתחולים הרגילים: קריאה למתודת ה"אב" (super), ואתחול ה-UI בשורות 8-9.
שלב 2. הבאת 3 הווידג'טים על פי ה-id שלהם:
- songSelectSpinner = (Spinner) findViewById(R.id.songs_spinner);
- textBoxox = (TextView)findViewById(R.id.output_box);
- applyButton = (Button)findViewById(R.id.apply_button);
שלב 3. יצירת המתאם (Adapter) בין הרשימה שתשמש כתפריט לבין הווידגט. בעזרת המתאם מחברים את רשימת השמות לאובייקט ה-spinner והופכים אותה לתפריט. הפרמטרים של ה-constructor:
- context. ראה this.
- ה-id של ה-resource. כאן אנחנו משתמשים בתבנית מוכנה מראש של אמדרואיד - simple_spinner_item. אנדרואיד כולל תבנית נוספת ל-spinner:נסו להחליף את simple_spinner_item ב: simple_spinner_dropdown_item. העיצוב הגראפי שיתקבל יהיה מעט שונה.
- רשימת הפריטים - במקרה שלנו רשימת השירים - הנמצאת בקובץ res/raw/array.xml.
אגב, יצירת ה-Adapter הודגמה כבר בתרגיל הקודם עבור ה-ListView. שם מערך השמות הוגדר בקובץ ה-java בתוך האובייקט.
ArrayAdapter<String> songsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, getResources( .getStringArray(R.array.songsArray));
שלב 4. חיבור ה-Adapter לאובייקט.
ה-Adapter שנוצר בשלב -3, songsAdapter, מחובר לאובייקט ה-spinner ע"י המתודה setAdapter.
songSelectSpinner.setAdapter(songsAdapter);
זהו. יצירת ה-spinner הושלמה.
כעת נותר להגדיר את ה-callback שיחבר בין הלחיצה על הכפתור (הוספנו כאמור כפתור רגיל בשם applyButton) לבין שליפת האלמנט בתפריט שנבחר ב-spinner. יצירת ה-callback נעשית כרגיל - קרה למטה. בתוך המתודה onClick מתבצעות שתי פעולות:
שורה 3: שליפת שם השיר שנבחר.
שורה 4: הצגת השיר הנבחר ב-UI.
- applyButton.setOnClickListener(new View.OnClickListener() {
- public void onClick(View view) {
- String selectedSong = getResources().getStringArray(R.array.songsArray)[songSelectSpinner.getSelectedItemPosition()];
- textBox.setText("Selected song is: " + selectedSong);
- }
- });
נ.ב.
"גיליתי" מדריך ל-spinner באתר המפתחים של אנדרואיד:
http://developer.android.com/resources/tutorials/views/hello-spinner.html
יש שם למעשה מדריך מעניין ל-widgets and views.
מקווה שהפוסט הנ"ל יסייע במתן אוריינטציה לחומר הרב המופיע באתר של אנדרואיד. זאת הרי אחת ממטרותיו בעצם.
