הכרנו כבר כמה מחלקות (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.
מקווה שהפוסט הנ"ל יסייע במתן אוריינטציה לחומר הרב המופיע באתר של אנדרואיד. זאת הרי אחת ממטרותיו בעצם.
תודה רבה על כל ההעשרה והקדשת הזמן!
השבמחק..לא מובן מאליו.
הי רונן צריכה עזרה במשהו אתה זמין?
השבמחק