Wednesday, April 27, 2011

תכנות לאנרדואיד בקלות פרק 6 – בניית Layouts על ידי code

מבוא
בפרק הקודם ראינו כיצד ניתן לבנות layouts (מסכים) שונים ע"י שימוש בשפת markup – XML כפי שאנחנו מכירים מפלטפורמות אחרות כגון WEB/ASP.NET או WPF.
ע"פ הנחייה של Google וכל best practice שתפגשו אשר דן בסוגיה (XML או קוד), מומלץ לשתמש ב XML על מנת לבנות layouts, אך בכל זאת כדאי מאוד שנכיר גם את השיטה השניה, בנייה ע"י code.
בואו נתחיל:
בואו ניזכר במתודה אשר נקראית
 setContentView(R.layout.main),
זוהי מתודה של המחלקה Activity, אשר בבנאי שלה אנו בעצם שמים reference ל VIEW אשר יופיע לנו בזמן שהActivity הרלוונטי בפוקוס (Forground).
במקרה ה XML-י הבנאי קיבל שם קובץ הLayout. כאשר אנו כותבים את כל הממשק בקוד, הוא יקבל View.
בואו נראה דוגמא קצרה:
נניח שאני רוצה שה VIEW של ה Activity שלי יכיל:
Button – עם המלל hit me
TextView - עם המלל : “hello world”
כמו כן, ארצה ששני הcontrols הללו יופיעו בצורה מאונכת אחד מעל השני, וממורכזים אופקית.
הקוד שיבצע את המשימה הנ"ל הינו הקוד הבא:

public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);




// views declaration


LinearLayout linearLayout = new LinearLayout(this);


Button btn = new Button(this);


TextView tv = new TextView(this);




// setting parameters for the main linearlayout container


linearLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));


linearLayout.setOrientation(LinearLayout.VERTICAL);


linearLayout.setGravity(Gravity.CENTER_HORIZONTAL);




// setting parameters for the textview


tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,


LayoutParams.WRAP_CONTENT));


tv.setText("hello world");


linearLayout.addView(tv, 0);


linearLayout.addView(btn, 1);




// setting parametrs for the button


btn.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));


btn.setText("hit me");




// setting the linear layout as the view of the current activity


setContentView(linearLayout);






}




מהם היתרונות ומהם החסרונות של בנייה layouts בשיטה זו?
החסרונות המוהבקים הם:
- חוסר הפרדה בין לוגיקה לבין UI ברמת החלוקה לקוד, יכול להיווצר ערבוב של השניים, מה שיקשה על התחזוקה של הקוד.
- יש צורך להכיר באופן לא הכי אינטואיטיבי את הAPI על מנת לדעת בדיוק כיצד לגשת לאיזשהו פרמטר חשוב שאנחנו רוצים להגדיר, כגון gravity, או LayoutParams.
- מה יקרה כשנרצה להעביר את הקוד הזה למישהו על מנת שיתחזק אותו? יהיה לו מעט קשה להבין מהם המקומות שבהן הוא צריך לכתוב קוד חדש, כי הוא לא מחולק כמו שצריך.
- אין עורך גרפי, לא ניתן לגרור controls כמו במצב ה XML י, לכן אנחנו לא באמת יודעים כיצד ה layout ייראה עד שנריץ את הפרוייקט שלנו באמולטור או במכשיר הנייד שלנו.
- קשה לעשות re use בקוד שכזה, כי ב XML ניתן לעשות include ל controls ב layouts אחרים, על מנת ליצור תבניות בדומה לCSS*
*לא יילמד במדריך זה
ומהם היתרונות?
- למפתחי ה swing שביניכם, השיטה הזאת ממש דומה לבניית ממשקים בswing ואתם תרגישו מאוד בנוח
- הכתיבה הינה מהירה יותר למנוסים שביניכם וברגע שרגילים לכתוב קוד OO, אז יש שטף בכתיבה מבלי לעבור XML אחורה וקדימה.
- בעיקרון, אפשר לכתוב פחות ולהשיג יותר.