
DialogFragment היא פרגמנט שמוצגת כדיאלוג מותאם אישית. ההרצאה בונה דיאלוג שאלה עם כפתורי Yes ו-No שמדווח למיין אקטיביטי.QuestionDialogFragment. ה-layout הוא LinearLayout אנכי עם רקע, padding, ImageView של סימן שאלה (40dp), TextView לשאלה (מודגש, לבן, גודל 20, עם tools:text להצגה בדיזיינר בלבד), ו-LinearLayout אופקי ובו שני כפתורים, Yes ו-No.onCreateView שומרים את ה-layout בשם linearLayoutRoot, משיגים דרכו את ה-TextView ושני הכפתורים עם findViewById, ובסוף מחזירים אותו.getArguments().getString(...) ומוצג עם setText.yes ו-no. בלחיצה על כפתור קוראים ל-dismiss() וקוראים לפונקציה המתאימה דרך getActivity() עם casting. כדי ש-dismiss יעבוד, הפרגמנט צריכה לרשת DialogFragment (גרסת support).setCancelable(false) מונע סגירה בלחיצה מחוץ לדיאלוג, והמשתמש חייב לענות.questionText ל-Bundle עם putString, מגדירה אותו עם setArguments ומחזירה את הדיאלוג.onClick שיוצר את הדיאלוג עם newInstance (הטקסט "delete this product"), וקורא ל-show(getSupportFragmentManager(), null). האקטיביטי מממשת את QuestionDialogFragment.Callbacks ומציגה Toast על Yes או No.DialogFragment.הטקסט המלא של הדקות הראשונות בהרצאה «Dialog Fragment» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
ראינו שבמקום ListActivity קיימת לנו ListFragment שמבצעת את אותו הדבר, ובמקום PreferenceActivity קיימת לנו PreferenceFragment שמבצעת את אותו הדבר. בעבר התעסקנו גם עם Dialogs, וראינו שקיימים כל מיני סוגי Dialogs.
בעולם הפרגמנט קיימת לנו גם דיאלוג פרגמנט שמיועדת להיות מעין קסטום דיאלוג במקום הדיאלוג שהשתמשנו בה בעבר. אז בואו נראה איך אנחנו יכולים להשתמש עם דיאלוג פרגמנט.
הדבר הראשון שאנחנו הולכים לעשות זה פשוט להוסיף פרגמנט חדשה. בואו ניגש, נבצע פרגמנט, ובואו נקרא לפרגמנט הזאת Question Dialogue Fragment. בואו נוסיף את הפרגמנט, נסדר טיפה את הקוד, ניפטר פה מהקונסטרקטור הרק, כי גם ככה יש לנו אחד כזה, בצורה כזאת, וניגש קודם כל לסדר את ה-layout.
עכשיו, המטרה שלנו זה לבנות איזושהי פרגמנט שמתאר את Dialog Fragment של שאלה, Question Dialog, והמשתמש יכול לענות עליה בכן או לא, ממש כמו שעשינו בעבר, לדוגמה, עם alert dialog.
אז בואו ניגש לכאן, ונתחיל לסדר את ה-layout של הפריגמנט. אז מה אנחנו בעצם רוצים להציג ליוזר? אז מה שאנחנו רוצים לעשות, זה קודם כל לסדר כמה דברים ברמת ה-layout.
מה שאנחנו רוצים לעשות זה להגדיר שאנחנו קודם כל wrap content, מבחינת הדיאלוג עצמה, ה-layout שלה. אנחנו רוצים איזשהו background, נבחר איזשהו צבע כזה.
לאחר מכן אנחנו רוצים להגדיר orientation, בואו אבל, נגדיר שאנחנו linear בעצם, זה יהיה יותר גיוני. נגדיר orientation, vertical.
לאחר מכן נגדיר איזשהו padding מסוים, בואו ניתן לו איזה 30, והנה יש לנו כאן, קודם כל, מתחיל להיות ה-layout של הדיאלוג. נגדיר לנו איזה image view, ניתן איזה 40 dp, גם ל-width וגם ל-height, יש לנו כאן src, בתוך drawable, יש לנו question.
לאחר מכן, בואו נגדיר לעצמנו איזה TextView כזה, גם כן, WrapContent, WrapContent, ואנחנו רוצים קודם כל ID, TextViewQuestion, בכדי להכניס לו את הטקסט בצורה דינמית.
אנחנו רוצים, בואו נניח TextStyle to Bold, שאירו את זה חזק, TextColor, בואו ניקח לבן, רואים את זה יותר טוב על האדום, בואו ניקח text size 20, ובואו ניקח tools.time.text, ואז נוכל להגדיר איזשהו טקסט שרואים אותו רק בדיזיינר ולא באמת בריצה, כי בריצה אנחנו רוצים טקסט אחר.
אז בואו נגדיר פה question.text בצורה כזאת, ומה שאנחנו רוצים לעשות בנוסף זה לשים אותם אחד ליד השני ולא אחד מתחת השני. אז בואו ניקח linear layout נוסף, יש לנו כאן ב-linear layout match parent ו-rap content, נזרוק את שניהם בתוכו, בצורה כזאת, ובואו נגדיר להם gravity, אבל זה בעצם כאן הגיוני להגדיר את ה-gravity, בואו ניקח layout gravity,
center vertical לדוגמה, ואז טיפה מסתדר יותר טוב באמצע, ומה שאנחנו רוצים לעשות זה שני לחצנים של כן ולא אז הנה יש לנו פה button, בואו נגדיר אותו כrap content יש לנו כאן בבטן id, אנחנו הולכים להשתמש איתו בקוד בואו נגדיר שהבטן הראשון זה yes, text yes גם כאן היינו יכולים להגדיר את הטקסט דינמית
אבל בואו נניח שהדיאלוג הזאת, הטקסט שלה הוא לא דינמי ובואו נגדיר שיש לנו TextAllCapsFalse וגם TextSize20, ויש לנו פה עוד לחצן שאנחנו רוצים, והלחצן הבא הוא No, מגדיר לו TextNo, IDButtonNo, וגם את זה נשים עם LinearLayout, MatchParent, WrapContent,
בכדי ששניהם יהיו אחד ליד השני, ולא אחד מתחת לשני, הנה זה נמצא בדיוק באמצע, או מתחיל להיראות יותר טוב. בואו נגדיר שהליניאר לאאוט הזאת תהיה Gravity Center Horizontal, ואז זה טיפה זה אז לאמצע, ונגדיר את אותו הדבר גם כאן, בכדי להיות עקביים, ואפילו בואו נגדיר כאן איזה שהוא
הוא Gravity Center, בכדי שהכל יהיה בול באמצע, ונראה לי שנסתפק בזה. אוקיי, אז הנה יש לנו עכשיו בעצם את הממשק משתמש של הדיאלוג.
בואו נגדיר שאנחנו כאן בסימן שאלה כזה. ומה שאנחנו רוצים לעשות, זה לגשת לקוד ולבנות את הקוד של הדיאלוג. אז יש לנו כאן את ה-onCreateView, ובואו נחלק את השורה הזאת לשני חלקים.
הדבר הראשון זה אנחנו רוצים את הLinearLayoutRoute הזה, LinearLayout, ואנחנו רוצים בשורה האחרונה להחזיר אותו. למה אנחנו רוצים את זה?
כי אנחנו רוצים עכשיו להתחיל לקבל את כל הרכיבים של ה-UI, ולהכניס אליהם ערכים דינמית, או להירשם לאירועים שלהם דינמית. הרכיב הראשון שאנחנו רוצים זה ה-TextView.
קראנו לו TextView Question, בואו נכניס אליו TextView, ניגש לLinearLayout, FindViewById, RID, TextViewQuestion. הדבר הבא שאנחנו רוצים זה Button, והButton הראשון זה Yes, כי אנחנו רוצים להירשם דינמית לאירועים שלהם, LinearLayoutRoot, FindRIDButtonYes, נשכפל, יש לנו פה ButtonNo,
בצורה כזאת. אחרי שיש לנו את הרכיבים, אנחנו רוצים להביא מידע. בואו ניקח את ה-Question Text. ה-Question Text שלנו זה משהו שאנחנו רוצים לקבל דינמית, מפני שאנחנו רוצים שה-Question Dialog Fragment הזאת תשרת כל מיני דיאלוג שמציגות שאלה למשתמש.
אז כמובן, בגלל שהדיאלוג הולכת להיות מוצגת באקטיביטי, במקרה הזה במיין אקטיביטי, אנחנו רוצים שהמיין אקטיביטי תשלח אלינו את השאלה, אז אנחנו רוצים לקבל את השאלה מהפרמטרים שמתקבלים לתוך הפרייגמנט, זה יהיה getArguments, נקודה getString, getArguments מחזירה מנות הבנדל, אנחנו רוצים getString, ובואו ניקח בדיוק את אותו הטקסט הזה שישרת אותנו בתור המפתח של
השאלה, אחרי שיש לנו את השאלה עצמה שאנחנו רוצים לשאול את המשתמש, אנחנו רוצים להגשת ל-Text View Question, to set Text, ואת ה-Question Text.
הדבר הבא שאנחנו רוצים זה להירשם לאירועים של הלחצנים. בואו ניגש ל-Button Yes, ונירשם ל-Set On