ไม่ใช่เรื่องแปลกที่นักพัฒนาจะพบว่าตัวเองต้องการไฟล์ หัวหอม ส่วนประกอบที่ไม่ได้จัดเตรียมโดยแพลตฟอร์มที่พวกเขากำหนดเป้าหมายหรือมีให้ แต่ขาดคุณสมบัติหรือพฤติกรรมบางอย่าง คำตอบสำหรับทั้งสองสถานการณ์คือคอมโพเนนต์ UI ที่กำหนดเอง
โมเดล UI ของ Android สามารถปรับแต่งได้โดยเนื้อแท้โดยมีวิธีการ การปรับแต่ง Android , การทดสอบ และความสามารถในการสร้าง คอมโพเนนต์ UI ที่กำหนดเอง ในรูปแบบต่างๆ:
สืบทอดองค์ประกอบที่มีอยู่ (เช่น TextView
, ImageView
ฯลฯ ) และเพิ่ม / แทนที่ฟังก์ชันที่จำเป็น ตัวอย่างเช่น a CircleImageView
ที่สืบทอด ImageView
แทนที่ onDraw()
ฟังก์ชัน จำกัด รูปภาพที่แสดงเป็นวงกลมและเพิ่ม loadFromFile()
ฟังก์ชั่นโหลดภาพจากหน่วยความจำภายนอก
สร้างส่วนประกอบของสารประกอบ จากหลายองค์ประกอบ วิธีนี้มักจะใช้ประโยชน์จาก เลย์เอาต์ เพื่อควบคุมวิธีการจัดเรียงส่วนประกอบบนหน้าจอ ตัวอย่างเช่น a LabeledEditText
ที่สืบทอด LinearLayout
ด้วยแนวนอนและมีทั้ง a TextView
ทำหน้าที่เป็นป้ายกำกับและ EditText
ทำหน้าที่เป็นช่องป้อนข้อความ
วิธีนี้สามารถใช้ประโยชน์จากแนวทางก่อนหน้านี้ได้เช่นส่วนประกอบภายในอาจเป็นแบบเนทีฟหรือกำหนดเอง
แนวทางที่หลากหลายและซับซ้อนที่สุดคือ สร้างส่วนประกอบที่วาดขึ้นเอง . ในกรณีนี้ส่วนประกอบจะสืบทอด View
ทั่วไป คลาสและฟังก์ชันแทนที่เช่น onMeasure()
เพื่อกำหนดเค้าโครง onDraw()
เพื่อแสดงเนื้อหา ฯลฯ ส่วนประกอบที่สร้างด้วยวิธีนี้มักจะขึ้นอยู่กับ Android เป็นอย่างมาก API การวาดภาพ 2D .
CalendarView
Android มีเนทีฟ CalendarView
ส่วนประกอบ . ทำงานได้ดีและมีฟังก์ชันการทำงานขั้นต่ำที่คาดหวังจากส่วนประกอบปฏิทินใด ๆ โดยแสดงเดือนเต็มและไฮไลต์วันปัจจุบัน บางคนอาจบอกว่ามันดูดีเช่นกัน แต่ถ้าคุณอยากได้ลุคแบบเนทีฟและไม่สนใจที่จะปรับแต่งรูปลักษณ์ของมันเลย
ตัวอย่างเช่น CalendarView
ส่วนประกอบไม่มีวิธีเปลี่ยนวิธีการทำเครื่องหมายวันใดวันหนึ่งหรือสีพื้นหลังที่จะใช้ นอกจากนี้ยังไม่มีวิธีการเพิ่มข้อความหรือกราฟิกที่กำหนดเองเพื่อทำเครื่องหมายในโอกาสพิเศษเป็นต้น กล่าวโดยย่อส่วนประกอบจะมีลักษณะดังนี้และแทบจะไม่สามารถเปลี่ยนแปลงอะไรได้:
CalendarView
ใน AppCompact.Light
ธีม
แล้วจะสร้างมุมมองปฏิทินของตัวเองได้อย่างไร วิธีการใด ๆ ข้างต้นจะได้ผล อย่างไรก็ตามการใช้งานจริงมักจะแยกแยะตัวเลือกที่สาม (กราฟิก 2D) และปล่อยให้เราใช้วิธีการอื่นอีกสองวิธีและเราจะใช้ทั้งสองอย่างผสมกันในบทความนี้
คุณสามารถค้นหาซอร์สโค้ดเพื่อติดตาม ที่นี่ .
ก่อนอื่นมาเริ่มกันที่ลักษณะของส่วนประกอบ เพื่อให้ง่ายขึ้นให้แสดงวันในตารางและที่ด้านบนสุดชื่อของเดือนพร้อมกับปุ่ม 'เดือนถัดไป' และ 'เดือนก่อนหน้า'
มุมมองปฏิทินที่กำหนดเอง
เค้าโครงนี้ถูกกำหนดไว้ในไฟล์ control_calendar.xml
ดังต่อไปนี้ โปรดทราบว่ามาร์กอัปซ้ำ ๆ บางส่วนถูกย่อด้วย ...
:
... Repeat for MON - SAT.
สามารถรวมเค้าโครงก่อนหน้าตามที่เป็นอยู่ใน Activity
หรือ a Fragment
และมันจะทำงานได้ดี แต่การห่อหุ้มเป็นส่วนประกอบ UI แบบสแตนด์อโลนจะป้องกันไม่ให้โค้ดซ้ำและอนุญาตให้มีการออกแบบโมดูลาร์โดยที่แต่ละโมดูลจะจัดการความรับผิดชอบเดียว
คอมโพเนนต์ UI ของเราจะเป็น LinearLayout
เพื่อให้ตรงกับรูทของไฟล์เลย์เอาต์ XML โปรดทราบว่าเฉพาะส่วนที่สำคัญเท่านั้นที่จะแสดงจากโค้ด การใช้งานส่วนประกอบอยู่ใน CalendarView.java
:
public class CalendarView extends LinearLayout { // internal components private LinearLayout header; private ImageView btnPrev; private ImageView btnNext; private TextView txtDate; private GridView grid; public CalendarView(Context context) { super(context); initControl(context); } /** * Load component XML layout */ private void initControl(Context context) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.control_calendar, this); // layout is inflated, assign local variables to components header = (LinearLayout)findViewById(R.id.calendar_header); btnPrev = (ImageView)findViewById(R.id.calendar_prev_button); btnNext = (ImageView)findViewById(R.id.calendar_next_button); txtDate = (TextView)findViewById(R.id.calendar_date_display); grid = (GridView)findViewById(R.id.calendar_grid); } }
รหัสค่อนข้างตรงไปตรงมา เมื่อสร้างคอมโพเนนต์จะขยายเค้าโครง XML และเมื่อเสร็จแล้วจะกำหนดการควบคุมภายในให้กับตัวแปรโลคัลเพื่อให้เข้าถึงได้ง่ายขึ้นในภายหลัง
เพื่อให้ส่วนประกอบนี้ทำงานเป็นมุมมองปฏิทินได้จริงตรรกะทางธุรกิจบางอย่างจึงเป็นไปตามลำดับ มันอาจจะดูซับซ้อนในตอนแรก แต่ก็มีไม่มากนัก มาดูรายละเอียดกัน:
การปรับประสิทธิภาพของฐานข้อมูลเซิร์ฟเวอร์ sql
มุมมองปฏิทินกว้างเจ็ดวันและรับประกันได้ว่าทุกเดือนจะเริ่มต้นที่ใดที่หนึ่งในแถวแรก
ขั้นแรกเราต้องหาตำแหน่งที่เดือนเริ่มต้นจากนั้นเติมตำแหน่งทั้งหมดก่อนหน้านั้นด้วยตัวเลขจากเดือนก่อนหน้า (30, 29, 28 .. ฯลฯ ) จนกว่าเราจะถึงตำแหน่ง 0
จากนั้นเรากรอกวันสำหรับเดือนปัจจุบัน (1, 2, 3 ... ฯลฯ )
หลังจากนั้นก็มาถึงวันของเดือนถัดไป (อีกครั้ง, 1, 2, 3 .. ฯลฯ ) แต่คราวนี้เราจะเติมตำแหน่งที่เหลือในแถวสุดท้ายของตารางเท่านั้น
แผนภาพต่อไปนี้แสดงขั้นตอนเหล่านี้:
ไฟล์ .cpp คืออะไร
ตรรกะทางธุรกิจในมุมมองปฏิทินที่กำหนดเอง
ความกว้างของเส้นตารางถูกระบุไว้แล้วว่าเป็นเซลล์เจ็ดเซลล์ซึ่งแสดงถึงปฏิทินรายสัปดาห์ แต่ความสูงล่ะ? ขนาดที่ใหญ่ที่สุดสำหรับกริดสามารถกำหนดได้จากสถานการณ์กรณีที่เลวร้ายที่สุดของเดือน 31 วันที่เริ่มต้นในวันเสาร์ซึ่งเป็นเซลล์สุดท้ายในแถวแรกและจะต้องเพิ่มอีก 5 แถวเพื่อแสดงแบบเต็ม ดังนั้นการตั้งค่าปฏิทินให้แสดงหกแถว (รวม 42 วัน) จะเพียงพอที่จะรองรับทุกกรณี
แต่ไม่ใช่ทุกเดือนมี 31 วัน! เราสามารถหลีกเลี่ยงภาวะแทรกซ้อนที่เกิดขึ้นได้โดยใช้ฟังก์ชันวันที่ในตัวของ Android โดยไม่ต้องคิดจำนวนวันด้วยตัวเอง
ดังที่ได้กล่าวไว้ก่อนหน้าฟังก์ชันวันที่ที่จัดทำโดย Calendar
คลาสทำให้การใช้งานค่อนข้างตรงไปตรงมา ในส่วนประกอบของเรา updateCalendar()
ฟังก์ชันใช้ตรรกะนี้:
private void updateCalendar() { ArrayList cells = new ArrayList(); Calendar calendar = (Calendar)currentDate.clone(); // determine the cell for current month's beginning calendar.set(Calendar.DAY_OF_MONTH, 1); int monthBeginningCell = calendar.get(Calendar.DAY_OF_WEEK) - 1; // move calendar backwards to the beginning of the week calendar.add(Calendar.DAY_OF_MONTH, -monthBeginningCell); // fill cells (42 days calendar as per our business logic) while (cells.size() 4. ปรับแต่งได้ที่ Heart
เนื่องจากคอมโพเนนต์ที่รับผิดชอบในการแสดงแต่ละวันคือ GridView
สถานที่ที่ดีในการกำหนดวิธีการแสดงวันคือ Adapter
เนื่องจากมีหน้าที่ในการเก็บข้อมูลและขยายมุมมองสำหรับเซลล์กริดแต่ละเซลล์
สำหรับตัวอย่างนี้เราต้องการสิ่งต่อไปนี้จาก CalendearView
ของเรา:
- ปัจจุบันควรอยู่ในข้อความสีน้ำเงินตัวหนา.
- วันที่อยู่นอกเดือนปัจจุบันควรเป็นเป็นสีเทา.
- วันที่มีกิจกรรมควรแสดงไอคอนพิเศษ
- ส่วนหัวของปฏิทินควรเปลี่ยนสีตามฤดูกาล (ฤดูร้อนฤดูใบไม้ร่วงฤดูหนาวฤดูใบไม้ผลิ)
ข้อกำหนดสามข้อแรกทำได้ง่ายโดยการเปลี่ยนแอตทริบิวต์ข้อความและทรัพยากรพื้นหลัง มาใช้ CalendarAdapter
เพื่อดำเนินงานนี้ ง่ายพอที่จะเป็นคลาสสมาชิกใน CalendarView
โดยการแทนที่ getView()
ฟังก์ชั่นเราสามารถบรรลุข้อกำหนดข้างต้น:
@Override public View getView(int position, View view, ViewGroup parent) { // day in question Date date = getItem(position); // today Date today = new Date(); // inflate item if it does not exist yet if (view == null) view = inflater.inflate(R.layout.control_calendar_day, parent, false); // if this day has an event, specify event image view.setBackgroundResource(eventDays.contains(date)) ? R.drawable.reminder : 0); // clear styling view.setTypeface(null, Typeface.NORMAL); view.setTextColor(Color.BLACK); if (date.getMonth() != today.getMonth() || date.getYear() != today.getYear()) { // if this day is outside current month, grey it out view.setTextColor(getResources().getColor(R.color.greyed_out)); } else if (date.getDate() == today.getDate()) { // if it is today, set it to blue/bold view.setTypeface(null, Typeface.BOLD); view.setTextColor(getResources().getColor(R.color.today)); } // set text view.setText(String.valueOf(date.getDate())); return view; }
ข้อกำหนดการออกแบบขั้นสุดท้ายใช้เวลาทำงานมากขึ้นเล็กน้อย ก่อนอื่นเรามาเพิ่มสีของฤดูกาลทั้งสี่ใน /res/values/colors.xml
:
#44eebd82 #44d8d27e #44a1c1da #448da64b
จากนั้นเรามาใช้อาร์เรย์เพื่อกำหนดฤดูกาลสำหรับแต่ละเดือน (สมมติว่าเป็นซีกโลกเหนือเพื่อความเรียบง่ายขออภัยออสเตรเลีย!) ใน CalendarView
เราเพิ่มตัวแปรสมาชิกต่อไปนี้:
// seasons' rainbow int[] rainbow = new int[] { R.color.summer, R.color.fall, R.color.winter, R.color.spring }; int[] monthSeason = new int[] {2, 2, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2};
ด้วยวิธีนี้การเลือกสีที่เหมาะสมทำได้โดยการเลือกฤดูกาลที่เหมาะสม (monthSeason[currentMonth]
) จากนั้นเลือกสีที่ตรงกัน (rainbow[monthSeason[currentMonth]
) ซึ่งจะถูกเพิ่มลงใน updateCalendar()
เพื่อให้แน่ใจว่าได้เลือกสีที่เหมาะสมเมื่อใดก็ตามที่ปฏิทินมีการเปลี่ยนแปลง
// set header color according to current season int month = currentDate.get(Calendar.MONTH); int season = monthSeason[month]; int color = rainbow[season]; header.setBackgroundColor(getResources().getColor(color));
ด้วยเหตุนี้เราจึงได้ผลลัพธ์ดังต่อไปนี้:
สีของส่วนหัวจะเปลี่ยนไปตามฤดูกาล
โน๊ตสำคัญ เนื่องจากวิธี HashSet
เปรียบเทียบวัตถุตรวจสอบด้านบน eventDays.contains(date)
ใน updateCalendar()
จะไม่ให้ค่าเป็นจริงสำหรับออบเจ็กต์วันที่เว้นแต่จะเหมือนกันทุกประการ จะไม่ทำการตรวจสอบพิเศษใด ๆ สำหรับ Date
ประเภทข้อมูล. ในการหลีกเลี่ยงปัญหานี้การตรวจสอบนี้จะถูกแทนที่ด้วยรหัสต่อไปนี้:
for (Date eventDate : eventDays) { if (eventDate.getDate() == date.getDate() && eventDate.getMonth() == date.getMonth() && eventDate.getYear() == date.getYear()) { // mark this day for event view.setBackgroundResource(R.drawable.reminder); break; } }
5. เวลาออกแบบมันดูน่าเกลียด
ตัวเลือกของ Android สำหรับตัวยึดตำแหน่งในเวลาออกแบบอาจเป็นเรื่องที่น่าสงสัย โชคดีที่ Android สร้างอินสแตนซ์คอมโพเนนต์ของเราเพื่อแสดงผลในตัวออกแบบ UI และเราสามารถใช้ประโยชน์จากสิ่งนี้ได้โดยเรียก updateCalendar()
ในตัวสร้างส่วนประกอบ วิธีนี้ส่วนประกอบจะสมเหตุสมผลในเวลาออกแบบ

หากการเริ่มต้นคอมโพเนนต์เรียกร้องให้มีการประมวลผลจำนวนมากหรือโหลดข้อมูลจำนวนมากอาจส่งผลต่อประสิทธิภาพของ IDE ในกรณีนี้ Android มีฟังก์ชันที่ดีที่เรียกว่า isInEditMode()
ที่สามารถใช้เพื่อ จำกัด ปริมาณข้อมูลที่ใช้เมื่อคอมโพเนนต์ถูกสร้างอินสแตนซ์ในตัวออกแบบ UI ตัวอย่างเช่นหากมีเหตุการณ์มากมายให้โหลดลงใน CalendarView
เราสามารถใช้ isInEditMode()
ภายใน updateCalendar()
ฟังก์ชันเพื่อจัดเตรียมรายการเหตุการณ์ว่าง / จำกัด ในโหมดออกแบบและโหลดรายการจริงไม่เช่นนั้น
6. การเรียกใช้ส่วนประกอบ
ส่วนประกอบสามารถรวมอยู่ในไฟล์เลย์เอาต์ XML (ตัวอย่างการใช้งานสามารถพบได้ใน activity_main.xml
):
HashSet events = new HashSet(); events.add(new Date()); CalendarView cv = ((CalendarView)findViewById(R.id.calendar_view)); cv.updateCalendar(events);
และดึงมาเพื่อโต้ตอบเมื่อโหลดเลย์เอาต์:
HashSet
โค้ดด้านบนสร้าง CalendarView
ของเหตุการณ์เพิ่มวันปัจจุบันเข้าไปแล้วส่งต่อไปที่ CalendarView
เป็นผลให้ CalendarView
จะแสดงวันปัจจุบันเป็นสีน้ำเงินตัวหนาและใส่เครื่องหมายเหตุการณ์ไว้ด้วย:
CalendarView
การแสดงเหตุการณ์
7. การเพิ่มคุณสมบัติ
สิ่งอำนวยความสะดวกอื่นที่ Android มีให้คือการกำหนดแอตทริบิวต์ให้กับส่วนประกอบที่กำหนดเอง สิ่งนี้ช่วยให้ นักพัฒนา Android โดยใช้ส่วนประกอบเพื่อเลือกการตั้งค่าผ่าน XML เค้าโครงและดูผลลัพธ์ทันทีในตัวออกแบบ UI ซึ่งต่างจากที่ต้องรอดูว่า dateFormat
ดูเหมือนในรันไทม์ มาเพิ่มความสามารถในการเปลี่ยนการแสดงรูปแบบวันที่ในส่วนประกอบเช่นสะกดชื่อเต็มของเดือนแทนตัวย่อสามตัวอักษร
ในการดำเนินการนี้จำเป็นต้องมีขั้นตอนต่อไปนี้:
- ประกาศแอตทริบิวต์ เรียกว่า
string
และให้ /res/values/attrs.xml
ประเภทข้อมูล. เพิ่มไปที่ 'MMMM yyyy'
:
TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.CalendarView); dateFormat = ta.getString(R.styleable.CalendarView_dateFormat);
- ใช้แอตทริบิวต์ในเค้าโครงที่ใช้ส่วนประกอบและให้ค่าเป็น
CalendarView
:
Fragment
- สุดท้ายให้ส่วนประกอบใช้ประโยชน์จากค่าแอตทริบิวต์:
Activity
] สร้างโครงการและคุณจะสังเกตเห็นการเปลี่ยนแปลงวันที่ที่แสดงในไฟล์ ตัวออกแบบ UI ใช้ชื่อเต็มของเดือนเช่น“ กรกฎาคม 2015” ลองระบุค่าต่างๆและดูว่าเกิดอะไรขึ้น
การเปลี่ยน // long-pressing a day grid.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView view, View cell, int position, long id) { // handle long-press if (eventHandler == null) return false; Date date = view.getItemAtPosition(position); eventHandler.onDayLongPress(date); return true; } });
คุณลักษณะ.
8. การโต้ตอบกับคอมโพเนนต์
คุณได้ลองกดในวันใดวันหนึ่งแล้วหรือยัง? องค์ประกอบ UI ภายในในคอมโพเนนต์ของเรายังคงทำงานตามปกติและจะเริ่มการทำงานของเหตุการณ์เพื่อตอบสนองต่อการกระทำของผู้ใช้ แล้วเราจะจัดการกับเหตุการณ์เหล่านั้นอย่างไร?
คำตอบเกี่ยวข้องกับสองส่วน:
- จับภาพเหตุการณ์ภายในองค์ประกอบและ
- รายงานเหตุการณ์ไปยังพาเรนต์ของคอมโพเนนต์ (อาจเป็น
eventHandler
, CalendarView
หรือแม้แต่คอมโพเนนต์อื่น)
ส่วนแรกค่อนข้างตรงไปตรงมา ตัวอย่างเช่นในการจัดการรายการตารางที่กดยาวเรากำหนด Listener ที่เกี่ยวข้องในคลาสส่วนประกอบของเรา:
public interface EventHandler { void onDayLongPress(Date date); }
มีหลายวิธีในการรายงานเหตุการณ์ สิ่งที่ง่ายและตรงไปตรงมาคือการคัดลอกวิธีที่ Android ทำ: มีอินเทอร์เฟซสำหรับเหตุการณ์ของคอมโพเนนต์ที่นำไปใช้โดยพาเรนต์ของคอมโพเนนต์ (setEventHandler()
ในข้อมูลโค้ดด้านบน)
ฟังก์ชันของอินเทอร์เฟซสามารถส่งผ่านข้อมูลใด ๆ ที่เกี่ยวข้องกับแอปพลิเคชัน ในกรณีของเราอินเทอร์เฟซจำเป็นต้องแสดงตัวจัดการเหตุการณ์หนึ่งตัวซึ่งส่งผ่านวันที่สำหรับวันที่กด อินเทอร์เฟซต่อไปนี้ถูกกำหนดไว้ใน @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); HashSet events = new HashSet(); events.add(new Date()); CalendarView cv = ((CalendarView)findViewById(R.id.calendar_view)); cv.updateCalendar(events); // assign event handler cv.setEventHandler(new CalendarView.EventHandler() { @Override public void onDayLongPress(Date date) { // show returned day DateFormat df = SimpleDateFormat.getDateInstance(); Toast.makeText(MainActivity.this, df.format(date), LENGTH_SHORT).show(); } }); }
:
GridView
การนำไปใช้โดยผู้ปกครองสามารถส่งไปยังมุมมองปฏิทินผ่านทาง onDayLongPress()
นี่คือตัวอย่างการใช้งานจาก `MainActivity.java ':
Intents
การกดนานวันจะทำให้เหตุการณ์กดยาวที่จับและจัดการโดย BroadcastReceivers
และรายงานโดยโทร Activity
ในการใช้งานที่จัดเตรียมไว้ซึ่งจะแสดงวันที่ของวันที่กดบนหน้าจอ:

อีกวิธีหนึ่งขั้นสูงในการจัดการปัญหานี้คือการใช้ Android Service
และ Activity
. สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อจำเป็นต้องแจ้งให้ส่วนประกอบหลายอย่างเกี่ยวกับกิจกรรมของปฏิทิน ตัวอย่างเช่นหากการกดวันในปฏิทินต้องการให้แสดงข้อความใน EventHandler
และไฟล์ที่จะดาวน์โหลดโดยใช้พื้นหลัง Service
.
การใช้แนวทางก่อนหน้านี้จะต้องใช้ Intent
เพื่อให้ Activity
ไปยังคอมโพเนนต์จัดการเหตุการณ์แล้วส่งต่อไปยัง Service
ให้คอมโพเนนต์ออกอากาศเป็น BroadcastReceivers
แทน และทั้ง Activity
และ Service
รับผ่านทาง isInEditMode()
ไม่เพียง แต่ทำให้ชีวิตง่ายขึ้น แต่ยังช่วยแยก
|_+_|
และ |_+_|
ในคำถาม. สรุป
ดูพลังที่ยอดเยี่ยมของการปรับแต่ง Android! ทวีต ดังนั้นนี่คือวิธีสร้างส่วนประกอบที่กำหนดเองของคุณเองในไม่กี่ขั้นตอนง่ายๆ:
- สร้างเค้าโครง XML และจัดรูปแบบให้เหมาะกับความต้องการของคุณ
- รับคลาสคอมโพเนนต์ของคุณจากคอมโพเนนต์พาเรนต์ที่เหมาะสมตามเค้าโครง XML ของคุณ
- เพิ่มตรรกะทางธุรกิจของส่วนประกอบของคุณ
- ใช้แอตทริบิวต์เพื่อให้ผู้ใช้ปรับเปลี่ยนพฤติกรรมของคอมโพเนนต์
- เพื่อให้ง่ายต่อการใช้คอมโพเนนต์ในตัวออกแบบ UI ให้ใช้
|_+_|
ของ Android ฟังก์ชัน
ในบทความนี้เราได้สร้างมุมมองปฏิทินไว้เป็นตัวอย่างส่วนใหญ่เนื่องจากไม่มีมุมมองปฏิทินหุ้นในหลาย ๆ ด้าน แต่คุณไม่มีข้อ จำกัด ว่าจะสร้างส่วนประกอบประเภทใดได้บ้าง คุณสามารถใช้เทคนิคเดียวกันเพื่อสร้างทุกสิ่งที่คุณต้องการท้องฟ้ามีขีด จำกัด !
หลักการกำหนดรูปแบบการออกแบบ
ขอขอบคุณที่อ่านคู่มือนี้ขอให้คุณโชคดีในการเขียนโค้ด!