
AnimalDetailsActivity (Empty Activity). ה-layout שלה הוא FrameLayout ריק עם ID frameLayoutContainerDetails ו-padding של 16dp, כי כל ה-UI נמצא בפרגמנט.onCreate קוראים ל-getIntent().getExtras(), ומתוך ה-Bundle שולפים את החיה עם getSerializable וקאסטינג ל-Animal.AnimalDetailsFragment.newInstance(animal) (צריך להגדיר אותה static) ומוסיפים אותה ל-frameLayoutContainerDetails עם add ו-commit.MyApp.isLandscape() וקוראים ל-finish() ולאחריה return, כי finish לבדה לא עוצרת את הריצה של הפונקציה.FrameLayout אחד בשם frameLayoutContainerList. בלנדסקייפ יוצרים activity_main נוסף עם qualifier של Landscape: LinearLayout אופקי ובו שני FrameLayout ברוחב 0dp עם weight 1, אחד לרשימה ואחד ל-frameLayoutContainerDetails. ה-ID של הרשימה זהה לזה שבפורטרייט.savedInstanceState שווה null) מוסיפים AnimalListFragment בכל אוריינטציה. בלנדסקייפ בלבד מחפשים findFragmentById של הפירוט, ואם היא null מוסיפים AnimalDetailsFragment חדשה (בלי מידע).AnimalListFragment.Callbacks. בפורטרייט יוצרים Intent ל-AnimalDetailsActivity עם putExtra של החיה ו-startActivity. בלנדסקייפ קוראים ל-displayAnimal על פרגמנט הפירוט.finish() חובה return.הטקסט המלא של הדקות הראשונות בהרצאה «Master Details - Adding Activities» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
כעת, אחרי שהוספנו את הפרגמנס, אנחנו יכולים לעבור לאקטיביטיז. אז אלו אקטיביטיז יש לנו? יש לנו את המין אקטיביטי, שבמין אקטיביטי, בפורטרייט, אנחנו רוצים להציג רק את ה-list, ובלנסקייפ אנחנו רוצים להציג גם את ה-list וגם את ה-details.
אבל בנוסף, יש לנו גם details activity, שכאשר אנחנו נמצאים בפורטרייט והיוזר לוחץ על פריט ברשימה, אנחנו רוצים להציג לו את ה-details-אקטיביטי.
בואו נתחיל עם ה-details-אקטיביטי. בואו נצרף אקטיביטי. new יש לנו כאן אקטיביטי. נבחר ב-empty-אקטיביטי. ואנחנו רוצים לקרוא לאקטיביטי details-אקטיביטי.
או בואו נקרא לה ליתר דיוק animal details-אקטיביטי, כי היא מתארת מידע לגבי animal. נבצע Finish, וקודם כל בואו ניגש ל-Layout שלה.
יש לנו פה Activity Animal Details. נשנה את זה ל-Frame Layout, כי אנחנו פשוט רוצים להציג ב-Activity הזאת את הפרגמנט. זאת אומרת, אין לנו פה שום דבר נוסף שברצוננו להציג.
אז ראינו שאם כל מה שאנחנו רוצים זה רק להציג פרגמנט, אנחנו יכולים שהroot שלנו יהיה frame layout. ובואו ניתן איזשהו ID.
ה-ID שניתן יהיה frame layout container, ואנחנו רוצים details, נגדיר פה גם padding, 16dp, אנחנו יכולים להגדיר את זה כempty tag, בצורה כזאת, וכל מה שאנחנו רוצים זה פשוט להציג את הפרגמנט, כי ה-UI שלנו מוגדר בתוך הפרגמנט, בכדי לא לחזור על קוד.
מה אנחנו רוצים לעשות בקוד, בג'אבה קוד שלה? נבוא לג'אבה קוד ויש לנו כאן את ה-onCreate. אנחנו יודעים שכאשר בונים אובייקט מהAnimal Details Activity, רוצים להציג את הפרגמנט.
אז בואו נייצר כאן אובייקט Animal Details Fragment, ניגש ונקבל את ה-New. יש לנו Animal Details Fragment, ואנחנו רוצים להגיע ל-New Instance.
אני רואה שאין לנו פה את ה-New Instance. בואו נראה רגע למה. Animal Details Fragment. או, בגלל שזה אמור להיות static, משהו ששכחתי להגדיר.
ועכשיו אנחנו אמורים לקבל new instance בצורה כזאת. כעת אנחנו צריכים להביא את האנימל מאיפה בדיוק יש לנו אובייקט אנימל. אז כמובן שאנחנו היינו צריכים לקבל אובייקט כזה, כאשר יוצרים אובייקט מהאקטיביטי שלנו.
איך אנחנו מקבלים את זה? בואו ניגש לקבלת האינטנט. אינטנט שווה getIntent. הרי מי שיוצר את ה-Animal Details Activity חייב ליצור את זה עם Intent.
בתוך ה-Intent יש לנו את ה-Bundle. Intent getExtras מביא לנו את ה-Bundle ששלחו לנו, ומתוך ה-Bundle אנחנו יכולים לשלוף את ה-Animal.
bundle getSerializable, הוא נקרא Animal, ונעשה פה רק casting ל-Animal, וכעת אנחנו יכולים לשלוח את האנימל וכך להשיג פרגמנט שכבר מכילה את האנימל בתוכה. הדבר הבא שאנחנו רוצים לבצע זה get support fragment manager בגין transaction ולהוסיף לתוך RID frame layout container details את האנימל details fragment שהגדרנו.
נבצע commit, והנה יש לנו עכשיו הצגה של הפרגמנט באקטיביטי של הדיטלס. עכשיו יש לנו דבר אחד שאנחנו צריכים לחשוב עליו, כאשר אנחנו עובדים עם הדיטלס. מה קורה אם היוזר בעצם מריץ את האפליקציה בלנדסקייפ, או אפילו לא, אפילו אם הוא מריץ את האפליקציה בפורטרייט, ואז אנחנו מציגים לו את האקטיביטי של הדיטלס כאשר הוא לוחץ על פריט.
כלומר, היוזר מריץ את האפליקציה בצורה רגילה לחלוטין, לוחץ על פריט ברשימה כאשר הוא נמצא בפורטרייט, ואנחנו מציגים לו את האקטיביטי הזאת של האנימל דיטלס אקטיביטי.
ואז הוא רואה את הפריט, כ-details נפרד והכל בסדר, ובשלב הזה הוא משנה את האוריינטציה ל-Landscape. אם הוא משנה את האוריינטציה ל-Landscape, כמובן, האקטיביטי הזאת נוצרת מחדש.
אם היא נוצרת מחדש, onCreate מתבצעת. אם onCreate מתבצעת ואנחנו ב-Landscape, אנחנו לא רוצים להציג לו עדיין את ה-details, כי אמרנו שב-Landscape אנחנו רוצים להציג לו גם את הרשימה וגם את ה-Details.
זאת אומרת שאנחנו רוצים בעצם לחזור ל-MainActivity. זה בדיוק מה שכדאי לנו לבצע אם אנחנו נמצאים ב-Landscape. אז בואו נבדוק.
אם is Landscape, מה שאנחנו רוצים לעשות זה Finish ו-Return. פיניש בלבד לא יוצאת מהפונקציה, היא רק נותנת הוראה לסגור את האקטיביטי ולכן אנחנו רוצים גם להוסיף return בכדי לא לבצע את כל הקוד הזה.
אז בעצם הקוד שביצענו כרגע סוגר לנו את כל מה שצריך בנוגע לאנימל דיטלס אקטיביטי. כעת אנחנו יכולים ללכת ולבנות את המיין אקטיביטי, בואו ננקה פה טיפה, ניגש קודם כל לאקטיביטי מיין ליאוט, באקטיביטי מיין ליאוט מה שאנחנו רוצים לבצע זה קודם כל להבין שהליאוט הזה זה ליאוט עבור פורטרייט, אנחנו נצטרך להוסיף עוד layout
שיהיה עבור landscape, עבור portrait, כל מה שאנחנו רוצים זה רק להציג את ה-list בלבד, ולכן יש לנו פה frame layout בצורה כזאת, כאשר יש לנו כאן id, וה-id הוא frame layout container list, וכל מה שאנחנו רוצים לבצע עבור האקטיביטי של המיין, מיין אקטיביטי, אבל בפורטריט.
כעת אנחנו רוצים לשכפל את זה כך שיהיה לנו עוד ליאאוט עבור landscape. אז בואו ניגש לליאאוט, נבצע new layout resource file, ואנחנו נרצה שהשם יהיה אותו השם, activity underline main, נוסיף איזשהו Qualifier שיגדיר שהאוריינטיישן שלנו זה Landscape, נבצע אוקיי, ויש לנו עכשיו כאן למעשה
גם את ה-Landscape Layout. בואו נעבור לפה, הנה יש לנו פה Linear Layout, אנחנו לא רוצים שהוא יהיה ורטיקלי, אנחנו רוצים שהוא יישב בצורה הוריזונטלית, כן, אנחנו רוצים padding זהה, ובתוך אנחנו רוצים frame layout כפול 2, a width 0 dp, a height match parent, ואנחנו רוצים גם id, כאשר ה-id של ה-list חייב להיות זהה ל-id הקודם,
ה-id הקודם, אפשר להעתיק אותו מפה, היה frame layout container list, נעתיק אותו, נדביק אותו, ואנחנו רוצים גם משקל של אחד, ששניהם יישבו ממש אחד ליד השני, 50% כל אחד.
בואו נשכפל את זה. אנחנו רוצים שזה יהיה Frame Layout Container Details, אותו הדבר כמו מקודם. Details, בואו נראה שאנחנו ממש זהים, נעתיק, נדביק שנהיה on the safe side.
ויש לנו עכשיו Wait, והכל בסדר, אנחנו רואים ששניהם יושבים, אחד ליד השני. זאת אומרת, אם היוזר נמצא בפורטרייט, הוא רואה רק את ה-Activity, את ה-Layout הזה, ואז הוא יראה פה רק את ה-List, יש פה רק את ה-Frame Layout של ה-List.
אם היוזר נמצא ב-Landscape, אז הוא רואה את ה-List מצד שמאל ואת ה-Details מצד ימין. כל מה שנשארנו לעשות זה לבנות את הקוד