Saturday, May 11, 2013

תכנות לאנדרואיד בקלות פרק 9 – תפריטים - Menus

Menu באנדרואיד הינו אלמנט מאוד חשוב, כדאי לכלול אותו בכל אפליקציה על מנת לאפשר למשתמש להגדיר את ההגדרות וההעדפות שלו.
ישנן 2 דרכים אשר באמצעותן ניתן ליצור menu:
1. ע"י xml
2. ע"י code
יצירת menu ע"י XML

<?xml version="1.0" encoding="utf-8"?>


<menu xmlns:android="http://schemas.android.com/apk/res/android">


<item android:id="@+id/new_game"


android:icon="@drawable/ic_new_game"


android:title="@string/new_game"


android:showAsAction="ifRoom"/>


<item android:id="@+id/help"


android:icon="@drawable/ic_help"


android:title="@string/help" />


</menu>




תחת תיקיית res צרו תיקיה בשם menu ובתוכה צרו menu.xml, זה הקובץ אשר מכיל את ההגדרות עבור התפריט בתצורה הבאה:
תחת התגית של menu יש ליצור תגיות item אשר כל אחת תכיל:
· Id – על מנת שנוכל להחליט בקוד מה קורה כשלוחצים על הפריט הזה
· Icon – ה icon שיופיע על הitem
· Title – הכיתוב שיופיע על על ה item
· showAsAction – יופיע בגרסאות 3.0+ בaction bar(פירוט בהמשך המדריך)
יצירת התפריט בקוד:
במתודה onCreateOptionsMenu() יש ליצור את התפריט באופן הבא:
 
המתודה menu.add מקבלת :

menu.add(1, 1, 0, "Blu-Ray").setIcon(R.drawable.bluray);


menu.add(1, 2, 1, "DVD").setIcon(R.drawable.dvd);


menu.add(1, 3, 2, "Hard Disk").setIcon(R.drawable.hd);


menu.add(1, 4, 3, "Sites").setIcon(R.drawable.sites);


menu.add(1, 5, 4, "USB").setIcon(R.drawable.usb);




· GroupId (לקבץ כמה פריטים תחת group של items)
· itemId (ה id עבור על אפשרות בתפריט)
· Order (הסדר של הפריט בתוך התפריט)
· Title (הכיתוב של כל Item בתפריט)
· ניתן לשרשר לתוך menu.add() את setIcon (מקבל בתור פרמטר את ה id של התמונה מתוך ספריית res/Drawable.
עכשיו, כשיש לנו תפריט ב xml אנו צריכים לשלוף אותו מהקוד ולהגדיר מה קורה בעת לחיצה על כל פריט, (נושא זה משותף לשתי הדרכים ליצירת תפריט) נעשה את זה בעמוד הבא..
תפריט מקושר ל Activity ספציפי, לכן – על מנת להגדיר ב activity שיש menu יש לעשות override על המתודה הבאה של Activity:
onCreateOptionsMenu(Menu menu)


@Override


public boolean onCreateOptionsMenu(Menu menu) {


new MenuInflater(getApplicationContext()).inflate(R.menu.menu, menu);


return super.onCreateOptionsMenu(menu);


}


אנו בעצם מבצעים "ניפוח" של אזור ה menu ע"י קובץ הxml שהגדרנו ע"י המחלקה MenuInflater שזהו תפקידה, הבנאי שלה מקבל context ויש לה מתודה הנקראית inflate.
מתודה נוספת הנקראית
 onOptionsItemSelected(MenuItem item)
אחראית על כתיבת הפעולה הנחוצה עבור לחיצה על item ב menu, הדבר נעשה ע"י switch באופן הבא:

public boolean onOptionsItemSelected(MenuItem item) {


switch (item.getItemId())


{


case R.id.help:


showHelpScreen();


return true;


case R.id.new_game:


startNewGame();


return true;


}


return super.onOptionsItemSelected(item);


}


המתודה מקבלת MenuItem ואנחנו עושים switch-case ע"פ ה id שלו על מנת להבחין בין הלחיצות השונות על התפריט.
Context Menus
מהו context menu?
ראינו כבר menu רגיל, הינו menu חסר context, דהיינו – משותף לכל האפליקציה/ה activity הנוכחי.
הרעיון ב context menu הינו לממש תפריט בחירות אשר יש לו context, דהיינו, האפליקציה מודעת למה שאני לוחץ עליו, נניח מתוך רשימה או אפילו לכל אלמנט שעל ה VIEW שלי.
בואו נעשה דוגמא קצרה שתמחיש בדיוק על מה מדובר:
בואו נבנה layout מאוד בסיסי אשר מכיל TextView פשוט עם הכיתוב הנ"ל : “long tap”

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"


android:layout_width="fill_parent"


android:layout_height="fill_parent"


android:orientation="vertical"


android:gravity="center" >


<TextView android:id="@+id/long_press"


android:layout_width="wrap_content"


android:layout_height="wrap_content"


android:textSize="30dp"


android:text="long tap" />


</LinearLayout>


בואו ניצור תחת תיקיית res/menu קובץ בשם context_menu עם התוכן הנ"ל:

<menu xmlns:android="http://schemas.android.com/apk/res/android">


<item android:id="@+id/option1"


android:title="A Context Option" />


<item android:id="@+id/option2"


android:title="Another Context Option" />


</menu>


כעת, אנו צריכים להירשם לcontext menu לעיל, ז"א ליצור את הקשר בין הtextview שלנו לבין ה context menu.

//get a reference to the view for pressing


TextView tv = (TextView)findViewById(R.id.long_press);


//register if for context


registerForContextMenu(tv);




על מנת שה Activity שלנו יכיר את ContextMenu יש ליצור אותו בקוד ישירות מקובץ הXML שבנינו, באמצעות המתודה
 onCreateContextMenu()

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {


super.onCreateContextMenu(menu, v, menuInfo);


MenuInflater inflater = getMenuInflater();


inflater.inflate(R.menu.context_menu, menu);


}



זהו, אתם יכולים להריץ את הדוגמא ולראות כי הדבר אכן עובד, בעת לחיצה ארוכה אתם רואים תפריט context.
מה שנשאר לנו הוא לקנפג מה קורה כשאנחנו בוחרים אחת מהאפשרויות ב context menu, בדומה למתודה שמימשנו ב menu רגיל, הנקראית onOptionsItemSelected(), אנו נממש מתודה אחרת הנקראית:
onContextItemSelected
 באופן הבא:


public boolean onContextItemSelected(MenuItem item) {


//find out which menu item was pressed


switch (item.getItemId()) {


case R.id.option1:


doOptionOne();


return true;


הריצו את הפרוייקט שוב ותוודאו כי אכן קיבלנו את הנדרש.