PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG MỤC LỤC

Size: px
Start display at page:

Download "PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG MỤC LỤC"

Transcription

1 MỤC LỤC BÀI 1. GIỚI THIỆU VỀ ANDROID VÀ CÀI ĐẶT MÔI TRƯỜNG PHÁT TRIỂN Giới thiệu Lịch sử phát triển hệ điều hành Android Kiến trúc hệ điều hành Android Các thành phần cơ bản của một ứng dụng Android Android Application Lifecycle Cài đặt Android Studio Thiết bị ảo (AVD - Android Virtual Device) Debugging trên Android Studio Website hữu ích dành cho người lập trình BÀI 2. CHƯƠNG TRÌNH HELLO WORLD Tạo ứng dụng Android đầu tiên Cấu trúc một ứng dụng Android Chạy ứng dụng trên AVD Chạy ứng dụng trên Mobile Phone Một số phím tắt hữu dụng trong lập trình Android BÀI 3. LÀM VIỆC VỚI LAYOUT Giới thiệu về XML XML là gì? Cú pháp XML Giới thiệu về Layout Cách tạo Layout trong một dự án Android Frame Layout Linear Layout Table Layout Relative Layout Absolute Layout BÀI 4: THẢO LUẬN/BÀI TẬP 01: ANDROID LAYOUT

2 BÀI 5. ACTIVITY VÀ INTENT Khái niệm Activity Cách tạo Activity và kết nối với Layout Các kiểu xử lý sự kiện trong Android Truyền dữ liệu giữa các Activity BÀI 6. LÀM VIỆC VỚI TOAST, DIALOG VÀ NOTIFICATION Giới thiệu Toast Alert Dialog Promt Dialog BÀI 7. CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1) Giới thiệu View Nhóm điều khiển TextView Nhóm điều khiển Button Nhóm điều khiển TextFields Điều khiển CheckBox Điều khiển RadioButton Điều khiển Tab BÀI 8: THẢO LUẬN/BÀI TẬP 02: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1) BÀI 9. CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) Điều khiển TimePicker Điều khiển TimePickerDialog Điều khiển DatePicker Điều khiển DatePickerDialog BÀI 10: THỰC HÀNH 01: ỨNG DỤNG HELLO WORLD BÀI 11. SPINNER, LISTVIEW VÀ GRIDVIEW Điều khiển Spinner Điều khiển ListView Điều khiển GridView

3 BÀI 12: THỰC HÀNH 02: ANDROID LAYOUT BÀI 13: THẢO LUẬN/BÀI TẬP 03: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) BÀI 14: THỰC HÀNH 03: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1) 109 BÀI 15. LÀM VIỆC VỚI MENU Option menu Context menu BÀI 16: THỰC HÀNH 04: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) 120 BÀI 17: THẢO LUẬN/BÀI TẬP 04: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) BÀI 18: THỰC HÀNH 05: SPINNER, LISTVIEW, GRIDVIEW BÀI 19. LẬP TRÌNH CSDL VỚI SQLITE (1) Giới thiệu SQLite SQLite là gì? Có sử dụng được các câu lện SQL trong SQLite hay không? Có thể sử dụng C# để thao tác với CSDL SQLite hay không? Tạo cơ sở dữ liệu SQLite bằng cách nào? Cách tạo và lưu trữ CSDL SQLite trong một project Android Studio Các bước làm việc với SQLite trong Android BÀI 20: THỰC HÀNH 06: LÀM VIỆC VỚI MENU VÀ CONTEXT MENU BÀI 21: THẢO LUẬN/BÀI TẬP 05: LẬP TRÌNH CSDL VỚI SQLITE BÀI 22: THỰC HÀNH 07: LẬP TRÌNH CSDL VỚI SQLITE BÀI 23. LẬP TRÌNH CSDL VỚI SQLITE (2) Các đối tượng làm việc với CSDL SQLite Thao tác với CSDL SQLite BÀI 24: THỰC HÀNH 08: LẬP TRÌNH CSDL VỚI SQLITE (2) BÀI 25: THẢO LUẬN/BÀI TẬP 06: LẬP TRÌNH CSDL VỚI SQLITE (2)

4 BÀI 1. GIỚI THIỆU VỀ ANDROID VÀ CÀI ĐẶT MÔI TRƯỜNG PHÁT TRIỂN 1.1. Giới thiệu Android là một hệ điều hành dựa trên nền tảng Linux được thiết kế dành cho các thiết bị di động có màn hình cảm ứng như điện thoại thông minh và máy tính bảng. Ban đầu, Android được phát triển bởi Tổng công ty Android, với sự hỗ trợ tài chính từ Google và sau này được chính Google mua lại vào năm Android ra mắt vào năm 2007 cùng với tuyên bố thành lập Liên minh thiết bị cầm tay mở: một hiệp hội gồm các công ty phần cứng, phần mềm, và viễn thông với mục tiêu đẩy mạnh các tiêu chuẩn mở cho các thiết bị di động. Chiếc điện thoại đầu tiên chạy Android được bán vào tháng 10 năm Android có mã nguồn mở và Google phát hành mã nguồn theo Giấy phép Apache. Chính mã nguồn mở cùng với một giấy phép không có nhiều ràng buộc đã cho phép các nhà phát triển thiết bị, mạng di động và các lập trình viên nhiệt huyết được điều chỉnh và phân phối Android một cách tự do. Ngoài ra, Android còn có một cộng đồng lập trình viên đông đảo chuyên viết các ứng dụng để mở rộng chức năng của thiết bị, bằng một loại ngôn ngữ lập trình Java có sửa đổi.vào tháng 10 năm 2012, có khoảng ứng dụng trên Android, và số lượt tải ứng dụng từ Google Play, cửa hàng ứng dụng chính của Android, ước tính khoảng 25 tỷ lượt. Những yếu tố này đã giúp Android trở thành nền tảng điện thoại thông minh phổ biến nhất thế giới, vượt qua Symbian vào quý 4 năm 2010, và được các công ty công nghệ lựa chọn khi họ cần một hệ điều hành không nặng nề, có khả năng tinh chỉnh, và giá rẻ chạy trên các thiết bịcông nghệ cao thay vì tạo dựng từ đầu. Kết quả là mặc dù được thiết kế để chạy trên điện thoại và máy tính bảng, Android đã xuất hiện trêntv, máy chơi game và các thiết bị điện tử khác. Bản chất mở của Android cũng khích lệ một đội ngũ đông đảo lập trình viên và những người đam mê sử dụng mã nguồn mở để tạo ra những dự án do cộng đồng quản lý. Những dự án này bổ sung các tính năng cao cấp cho những người dùng thích tìm tòi hoặc đưa Android vào các thiết bị ban đầu chạy hệ điều hành khác. 4

5 1.2. Lịch sử phát triển hệ điều hành Android Tổng công ty Android (Android, Inc.) được thành lập tại Palo Alto, California vào tháng 10 năm 2003 bởi Andy Rubin (đồng sáng lập công ty Danger), Rich Miner (đồng sáng lập Tổng công ty Viễn thông Wildfire), Nick Sears (từng là Phó giám đốc T-Mobile) và Chris White (trưởng thiết kế và giao diện tại WebTV) để phát triển, theo lời của Rubin, "các thiết bị di động thông minh hơn có thể biết được vị trí và sở thích của người dùng". DÙ những người thành lập và nhân viên đều là những người có tiếng tăm, Tổng công ty Android hoạt động một cách âm thầm, chỉ tiết lộ rằng họ đang làm phần mềm dành cho điện thoại di động. Trong năm đó, Rubin hết kinh phí. Steve Perlman, một người bạn thân của Rubin, mang cho ông USD tiền mặt nhưng từ chối tham gia vào công ty. Google mua lại Tổng công ty Android vào ngày 17 tháng 8 năm 2005, biến nó thành một bộ phận trực thuộc Google. Những nhân viên của chủ chốt của Tổng công ty Android, gồm Rubin, Miner và White, vẫn tiếp tục ở lại công ty làm việc sau thương vụ này. Vào thời điểm đó không có nhiều thông tin về Tổng công ty, nhưng nhiều người đồn đoán rằng Google dự tính tham gia thị trường điện thoại di động sau bước đi này. Tại Google, nhóm do Rubin đứng đầu đã phát triển một nền tảng thiết bị di động phát triển trên nền nhân Linux. Google quảng bá nền tảng này cho các nhà sản xuất điện thoại và các nhà mạng với lời hứa sẽ cung cấp một hệ thống uyển chuyển và có khả năng nâng cấp. Google đã liên hệ với hàng loạt hãng phần cứng cũng như đối tác phần mềm, bắn tin cho các nhà mạng rằng họ sẵn sàng hợp tác với các cấp độ khác nhau. Ngày càng nhiều suy đoán rằng Google sẽ tham gia thị trường điện thoại di động xuất hiện trong tháng 12 năm Tin tức của BBC và Nhật báo phố Wall chú thích rằng Google muốn đưa công nghệ tìm kiếm và các ứng dụng của họ vào điện thoại di động và họ đang nỗ lực làm việc để thực hiện điều này. Các phương tiện truyền thông truyền thống lẫn online cũng viết về tin đồn rằng Google đang phát triển một thiết bị cầm tay mang thương hiệu Google. Một vài tờ báo còn nói rằng trong khi 5

6 Google vẫn đang thực hiện những bản mô tả kỹ thuật chi tiết, họ đã trình diễn sản phẩm mẫu cho các nhà sản xuất điện thoại di động và nhà mạng. Tháng 9 năm 2007, InformationWeek đăng tải một nghiên cứu của Evalueserve cho biết Google đã nộp một số đơn xin cấp bằng sáng chế trong lĩnh vực điện thoại di động. Ngày 5 tháng 11 năm 2007, Liên minh thiết bị cầm tay mở (Open Handset Alliance), một hiệp hội bao gồm nhiều công ty trong đó có Texas Instruments, Tập đoàn Broadcom, Google, HTC, Intel,LG, Tập đoàn Marvell Technology, Motorola, Nvidia, Qualcomm, Samsung Electronics, Sprint Nextel và T-Mobile được thành lập với mục đích phát triển các tiêu chuẩn mở cho thiết bị di động. Cùng ngày, Android cũng được ra mắt với vai trò là sản phẩm đầu tiên của Liên minh, một nền tảng thiết bị di động được xây dựng trên nhân Linux phiên bản 2.6. Chiếc điện thoại chạy Android đầu tiên được bán ra là HTC Dream, phát hành ngày 22 tháng 10 năm Biểu trưng của hệ điều hành Android mới là một con rôbốt màu xanh lá cây do hãng thiết kế Irina Blok tại California vẽ. Từ năm 2008, Android đã trải qua nhiều lần cập nhật để dần dần cải tiến hệ điều hành, bổ sung các tính năng mới và sửa các lỗi trong những lần phát hành trước. Mỗi bản nâng cấp được đặt tên lần lượt theo thứ tự bảng chữ cái, theo tên của một món ăn tráng miệng; ví dụ như phiên bản 1.5 Cupcake (bánh bông lan nhỏ có kem) tiếp nối bằng phiên bản 1.6 Donut (bánh vòng). Phiên bản mới nhất là 4.2 Jelly Bean (kẹo dẻo). Vào năm 2010, Google ra mắt loạt thiết bị Nexus một dòng sản phẩm bao gồm điện thoại thông minh và máy tính bảng chạy hệ điều hành Android, do các đối tác phần cứng sản xuất. HTC đã hợp tác với Google trong chiếc điện thoại thông minh Nexus đầu tiên, Nexus One. Kể từ đó nhiều thiết bị mới hơn đã gia nhập vào dòng sản phẩm này, như điện thoại Nexus 4 và máy tính bảng Nexus 10, lần lượt do LG và Samsung sản xuất. Google xem điện thoại và máy tính bảng Nexus là những thiết bị Android chủ lực của mình, với những tính năng phần cứng và phần mềm mới nhất của Android. Liên minh các thiết bị cầm tay: Ngày 5 tháng 11 năm 2007, Liên minh thiết bị cầm tay mở rộng (Open Handset Alliance), một côngxoocxiom bao gồm nhiều công ty trong đó có Texas Instruments, Tập đoàn Broadcom, Google, HTC, Intel, LG, Tập đoàn Marvell Technology, Motorola, Nvidia,Qualcomm, Samsung Electronics, Sprint Nextel và T-Mobile được thành lập với mục đích phát triển các tiêu chuẩn mở cho thiết bị di động. Cùng với sự thành lập của OHA, họ cũng giới thiệu sản phẩm Android đầu tiên. Nó là một thiết bị di động có hệ điều hành dựa trên nhân Linux phiên bản

7 Ngày 9 tháng 12 năm 2008, thêm 14 thành viên mới gia nhập dự án Android được công bố, gồm có ARM Holdings, Atheros Communications, Asustek Computer Inc, Garmin Ltd,Softbank, Sony Ericsson, Toshiba Corp, và Vodafone Group Plc. Một số phiên bản hệ điều hành Android: 1.3. Kiến trúc hệ điều hành Android Kiến trúc Android gồm 4 phần chính, mô hình dưới đây sẽ cho ta cái nhìn tổng quan về kiến trúc Android. Nhân của Android được phát triển dựa vào Kernel Linux 2.6. Mỗi tầng trong kiến trúc Android hoạt động dựa vào tầng bên dưới nó. 7

8 Kernel Linux layer: Dựa trên Kernel Linux version 2.6 bởi nó cung cấp các trình điều khiển các thiết bị phần cứng(driver), quản lý tiến trình, quản lý tài nguyên, bảo mật,... như sau: - Security system - Memory management - Process management - Network stack - Driver model. Libraries: Là các thư viện được viết bằng ngôn ngữ C/C++ sẽ được các developer phát triển ứng dụng android thông qua tầng Android Framework. Có thể kể ra đây một số thư viện quen thuộc với các lập trình viên như: - Media Libraries mở rộng từ PacketVideo s OpenCORE. Hỗ trợ nhiều định dạng video và image phổ biến: MPEG4, H.264, MP3, AAC, AMR, JPG, and PNG. - Surface Manager quản lý việc hiển thị và kết hợp đồ họa 2D và 3D. - LibWebCore dùng webkit engine cho việc render trình duyệt mặc định của HDH Android browser và cho dạng web nhúng (như HTML nhúng). Thư viện đồ họa 2D và 3D. 8

9 - SQLite quản lý database của ứng dụng. Runtime Android: - Gồm một tập hợp các thư viện Java Core. - Máy ảo Dalvik thực thi các file định dạng.dex (Dalvik Excutable). - Mỗi ứng dụng Android chạy trên tiến trình riêng của máy ảo Dalvik. Dalvik được viết để chạy nhiều máy ảo cùng một lúc một cách hiệu quả trên cùng một thiết bị. Application Framework: Google xây dựng cho các developer để phát triển các ứng dụng của họ trên Android chỉ bằng cách gọi các API. - View UI - để xây dựng layout của ứng dụng bao gồm: list view, text field, button, dialog, form - Content Providers - cho phép các ứng dụng truy cập dữ liệu từ các ứng dụng khác hoặc để chia sẻ dữ liệu của riêng ứng dụng. - Resource Manager - cung cấp cách thức truy cập đến non-code resources như các asset, graphic, image, music, video - Notification Manager - cho phép tất cả các ứng dụng hiển thị thông báo của mình trên hệ điều hành. - Activity Manager - quản lý vòng đời của các ứng dụng. Applications: Là các ứng dụng mà lập trình viên phát triển như Browser, Media Các thành phần cơ bản của một ứng dụng Android Activity: Một activity thể hiện một giao diện đồ họa người dùng. Ví dụ một activity có thể biểu diễn một danh sách các menu item để người dùng có thể chọn và có thể hiển thị ảnh cùng với tiêu đề. Một ứng dụng gửi tin nhắn văn bản có thể có một hoạt động là hiển thị một danh sách các liên hệ để gửi tin nhắn tới, hoạt động thứ hai là viết tin nhắn tới liên hệ được chọn, các hoạt động khác nữa là xem lại tin nhắn cũ hay thay đổi cài đặt. Mặc dù chúng làm việc cùng nhau để tạo thành một giao diện người dùng, mỗi activity độc lập với những cái khác. Mỗi activity là một lớp con của lớp cơ sở Activity. Một ứng dụng có thể gồm chỉ một activity hay nhiều activity. Thông thường, một trong số các activity được đánh dấu như là activity đầu tiên phải được trình diễn tới người dùng khi ứng dụng được khởi động. Chuyển từ một activity sang activity khác bằng cách cho activity hiện thời khởi động activity kế tiếp. 9

10 Mỗi activity đưa ra một cửa sổ mặc định để hiển thị giao diện. Thông thường, cửa sổ sẽ lấp đầy màn hình, nhưng nó có thể nhỏ hơn màn hình và nằm trên các cửa sổ khác. Một activity có thể sử dụng cửa sổ bổ sung - ví dụ như một pop-up dialog gọi cho một đáp ứng người dùng ở giữa của activity, hay một cửa sổ biểu diễn những cho người dùng với thông tin quan trọng khi họ chọn một item cụ thể trên màn hình. Nội dung trực quan của cửa sổ được cung cấp bởi một cây phân cấp các đối tượng view dẫn xuất từ lớp View. Mỗi view điều khiển một khoảng hình chữ nhật cụ thể bên trong cửa sổ. View cha chứa và tổ chức bố cục cho các view con. Các view con vẽ trong hình chữ nhật mà chúng điều khiển và đáp ứng lại các hành động người dùng trực tiếp ở khoảng trống này. Do đó, các view là nơi mà các tương tác của activity với người dùng diễn ra. Ví dụ một view có thể hiển thị một hình ảnh nhỏ và khởi tạo một hoạt động khi người dùng nhấn vào hình ảnh đó. Android có một số view đã xây dựng sẵn mà bạn có thể sử dụng gồm có các buttons, text view, editext, scroll bars, menu items, check boxes Lớp cơ sở Activity định nghĩa một loạt các sự kiện mà điều chỉnh vòng đời của một hoạt động. Class Activity định nghĩa các sự kiện sau đây: - oncreate(): Được gọi khi hoạt động được tạo ra lần đầu tiên - onstart(): Được gọi khi hoạt động trở nên hữu hình so với người dùng - onresume(): Được gọi khi hoạt động bắt đầu tương tác với người sử dụng - onpause(): Được gọi để dừng các hoạt động hiện tại và nối lại các hoạt động trước đó - onstop(): Được gọi khi hoạt động không còn hiển thị với người dùng - ondestroy(): Được gọi trước khi hoạt động bị phá hủy bởi hệ thống (bằng tay hoặc bằng hệ thống để bảo tồn bộ nhớ) - onrestart(): Được gọi khi hệ thống đã được dừng lại và khởi động lại một lần nữa. Vòng đời hoạt động của Activity - Toàn bộ thời gian sống của một activity xảy ra giữa lời gọi hàm oncreate() và ondestroy(). Activity của bạn nên thực hiện thiết đặt toàn cục global setup như định nghĩa layout trong hàm oncreate(), và trả lại toàn bộ tài nguyên trong phương thức ondestroy(). Ví dụ, nếu một activity có một tuyến đang chạy ngầm để download dữ liệu, nó có thể tạo ra tuyến đó trong phương thức oncreate() và dừng tuyến trong phương thức ondestroy(). - Thời gian sống thật (visible lifetime) của một activity xảy ra giữa lời gọi phương thức onstart() và onstop(). Trong suốt thời gian này, người dùng có thể nhìn thấy activity trên màn hình và tương tac với chúng.ví dụ, 10

11 onstop() được gọi khi một activity mới bắt đầu.giữa hai phương thức này, bạn có thể quản lý các nguồn tài nguyên cần thiết để hiển thị activity tới người dùng.ví dụ, bạn đăng ký một BroadcastReceiver trong onstart() để giám sát thay đổi tác động tới giao diện của, và hủy đăng ký trong phương onstop() khi người dùng không thấy giao diện hiển.activity xuất hiện và ẩn với người dùng - Thời gian chờ foreground lifetime) của một activity xảy ra giữa hai lời gọi onresume() và onpause(). Trong suốt thời gian này, activity là nền cho các activity khác trên màn. Một activity có thể thường xuyên chuyển trạng thái thành trạng thái chờ và hoạt ví dụ, onpause() được gọi khi thiết bị phần cứng ở trạng thái ngủ (sleep) hoặc một hộp thoại xuất hiện. Bởi vì trạng thái này có thể xảy ra thường xuyên nên mã lệnh trong hai phương thức này nên được viết cẩn thận để tăng tốc độ chuyển giữa các chế độ Services: Một service không có giao diện trực quan, nó chạy trên nền trong một khoảng thời gian không xác định. Ví dụ một service có thể chơi nhạc nền, hay nó nạp dữ liệu 11

12 trên mạng hay tính toán cái gì đó và cung cấp kết quả cho activity cần đến nó. Mỗi service mở rộng từ lớp cơ sở Service Một ví dụ cổ điển là media player chơi các bài hát từ một danh sách. Ứng dụng player có thể có một hay hai activity cho phép người dùng chọn bài hát và bắt đầu chơi. Tuy nhiên, music playback không tự nó được xử lý bởi một activity bởi vì người dùng sẽ mong muốn chơi tiếp nhạc khi họ rời khỏi player và làm cái gì đó khác. Để tiếp tục chơi nhạc, media player activity có thể khởi động một service chạy trên nền. Hệ thống sẽ giữ cho music playback service chạy thậm chí khi activity khởi động nó rời khỏi màn hình. Trong khi kết nối, bạn có thể giao tiếp với dịch vụ thông qua giao diện mà service đó trưng ra. Ví dụ như trong music service, giao diện này có thể cho phép người dùng pause, rewind, stop và restart lại playback. Giống như các activity và các thành phần khác khác, service chạy trong thread chính của tiến trình ứng dụng. Vì thế chúng không thể chặn những thành phần khác hay giao diện người dùng, chúng thường tạo ra các thead khác cho các nhiệm vụ hao tốn thời gian Content Provider: 12

13 Content providers quản lý truy cập tới dữ liệu. Chúng đóng gói dữ liệu, và cung cấp cơ chế cho phép định nghĩa bảo mật dữ liệu. Content providers là giao diện chuẩn kết nối dữ liệu trong một tiến trình cùng với mã nguồn chạy trong các tiến trình khác. Khi bạn muốn kết nối tới dữ liệu trong content provider, bạn sử đối tượng ContentResolver trong ứng dụng Context để giao tiếp với provider như một máy khách. Đối tượng ContentResolver giao tiếp với đối tượng, một thể hiện của lớp triên khai từ giao diện ContentProvider. Đối tượng provider nhận dữ liệu yêu cầu từ clients, xử lý yêu cầu và trả lại kết quả. Ban không cần phát triển provider của riêng bạn nếu không muốn chia sẻ dữ liệu với các ứng dụng khác. Tuy nhiên, bạn cần provider của mình để cung cáp những gợi ý cho tìm kiếm trong ứng dụng của bạn. Bạn luôn cần provider vì nếu bạn muốn sao chép và dán dữ liệu phức tạp hoặc các tệp từ ứng dụng của bạn sang ứng dụng khác. Android tự nó đã bao gồm content providers để quản lý dữ liệu như audio, video, images, và các thông tin liên hệ của bạn. Bạn có thể nhìn thấy một vài thông tin được liệt kê bằng cách sử gói android.provider.các provider này có thể kết nối tới các ứng dụng Android khác với một số hạn chế nhất đinh. Một số chủ đề quan trọng của Content Provider: - Content Provider Basics: Làm thế nào để truy cập dữ liệu trong một content provider khi dữ liệu được tổ chức dạng bảng. - Creating a Content Provider: Làm thế nào để tạo content provider của riêng mình. - Calendar Provider: Làm thế nào để truy cập Calendar Provider, là một phần của Android platform. - Contact Provider: Làm thế nào truy cập tới thông tin trong danh sách Contact Broadcast Receive: Một Broadcast Rreceiver là một thành phần không làm gì ngoài việc nhận và đáp lại các thông báo broadcast. Nhiều broadcast khởi đầu trong mã hệ thống - ví dụ như thông báo múi giờ thay đổi, pin yếu, ảnh đã được chụp, hay người dùng đã thay đổi ngôn ngữ Các ứng dụng có thể tạo ra các broadcast, chẳng hạn để ứng dụng khác biết được một số dữ liệu đã được tải về thiết bị và sẵn sàng cho việc sử dụng chúng. 13

14 Một ứng dụng có thể có một số Broadcast Receiver để đáp lại bất cứ thông báo nào mà nó cho là quan trọng. Tất cả các receiver mở rộng từ lớp cơ sở BroadcastReceiver. Broadcast Receiver không hiển thị một giao diện người dùng. Tuy nhiên chúng có thể bắt đầu một activity để đáp lại thông tin mà chúng nhận, hay chúng có thể sử dụng NotificationManager để cảnh báo người dùng. Notifications có thể lấy sự chú ý của người dùng bằng nhiều cách như lóe sáng đèn sau, rung, tạo ra âm thanh,... Chúng thường tạo một biểu tượng trong thanh trạng thái, nhờ đó người dùng có thể mở để lấy thông điệp Intents và Intent filter: Ba thành phần cơ bản của một ứng dụng activities, services, and broadcast receivers các thành phần này được kích hoạt thông qua các thông điệp được gọi là intents. Thông điệp Intent là cơ sở cho việc truy xuất giữa các thành phần trong một hoặc các ứng dụng khác nhau. Một đối tượng Intent là một cấu trúc dữ liệu bị động giữ một mô tả trừu tượng của một hành động thực thi. Có một vài cơ chế cho việc gửi intent tới từng thành phần: - Một đối tượng Intent được thông qua Context.startActivity() hoặc Activity.startActivityForResult() để khởi động một activity hoặc lấy một activity đã tồn tại để làm một việc gì đó. (Cũng có thể sử dụng Activity.setResult() để trả thông tin tới activity được gọi bằng phương thức startactivityforresult().) - Một đối tượng Intent được sử dụng thông qua phương thức Context.startService() để khởi tạo một service hoặc gửi một yêu cầu mới tới một service khác. Tương tự, một intent có thể được gửi thông qua phương thức Context.bindService() để tạo một kết nối giữa các thành phần đang gọi và một service. - Đối tượng Intent được gửi tới các phương thức (như Context.sendBroadcast(),Context.sendOrderedBroadcast(), hoặc Context.sendStickyBroadcast()) được gửi tới toàn bộ các service đang lắng nghe. Trong mỗi trường hợp, Android tìm các activity, service phù hợp hoặc thiết đặt broadcast receivers để trả lời tới intent, khởi tạo chúng nếu cần. Broadcast intents chỉ được gửi tới broadcast receivers, không bao giờ tới activities hoặc services. Một intent thông qua phương thức startactivity() chỉ được gửi tới một activity, không bao giờ tới một service hoặc broadcast receiver. 14

15 To inform the system which implicit intents they can handle, activities, services, and broadcast receivers can have one or more intent filters. Each filter describes a capability of the component, a set of intents that the component is willing to receive. It, in effect, filters in intents of a desired type, while filtering out unwanted intents but only unwanted implicit intents (those that don't name a target class). An explicit intent is always delivered to its target, no matter what it contains; the filter is not consulted. But an implicit intent is delivered to a component only if it can pass through one of the component's filters. Để thông báo cho hệ thống ngầm ý đồ mà họ có thể xử lý, activity, service, broadcast receivers có thể có một hoặc nhiều bộ lọc. Mỗi bộ lọc mô tả một khả năng của các thành phần, một tập hợp các intent mà thành phần đó là sẵn sàng nhận., Các bộ lọc các loại intents mong muốn, trong khi lọc sẽ loại bỏ những intent Process và Thread: Process: Mỗi ứng dụng là một tiến trình có tài nguyên và không gian bộ nhớ riêng. Trong một tiến trình có thể có một hoặc nhiều tuyến. Thread: Thông thường dùng Thread để xử lý các code xử lý nặng, hoặc mất thời gian có thể gây chậm chương trình hoặc giao diện bị block. Thread khá thông dụng và trong Android dùng lớp Thread của Java. Mặc định, mỗi ứng dụng chạy trong một process và code được thực thi trong thread chính của process đó. Nếu code xử lý quá lâu, không kịp phản hồi lại các sự kiện người dùng trong 5 giây thì sẽ xuất hiện dialog Application is not responding và người dùng có thể force close ứng dụng ngay lập tức. Dù không bị đóng ứng dụng thì việc ứng dụng bị chậm là khó chấp nhận. Code minh họa triển khai một Thread: 15

16 hread thread = new Thread() public synchronized void start() { // Khởi tạo các đối tượng cần thiết tại đây public void run() { // code xử lý chính của thread trong này super.run(); read.start(); //bắt đầu thread 16

17 1.5. Android Application Lifecycle PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG 1.6. Cài đặt Android Studio Chuẩn bị các công cụ để cài đặt môi trường phát triển (lập trình) Có nhiều công cụ để tạo ra một sản phẩm Android. Vấn đề là bạn chọn công cụ nào? - Sử dụng Visual Studio (với ngôn ngữ C# mà bạn quen thuộc) - Sử dụng Eclipse (Sử dụng ngôn ngữ Java) - Sử dụng Android Studio (Sử dụng ngôn ngữ Java) Trong khuôn khổ của môn học thì các bài học và demo sẽ được thực hiện trên Android Studio. Tuy nhiên có thể một số máy cấu hình không mạnh chạy Eclipse hay ADT sẽ phù hợp hơn là Android Studio vì vậy trong bài học này mình sẽ hướng dẫn nhanh cài đặt Eclipse hay ADT. Còn để cài đặt công cụ lập trình Android trên Visual Studio các bạn chỉ cần Google với từ khóa: "lập trình android trên visual studio" là xong 17

18 Cài đặt Android Studio Trước hết download bộ cài đầy đủ Android Studio tại link (không phân biệt OS 32 hay 64 bit): Sau khi tải về thành công, bạn chạy tập tin android-studio-bundle, hộp thoại Welcome to Setup Android Studio sẽ xuất hiện: 18

19 Nhấn Next để tiếp tục. Nếu hệ thống không phát hiện ra JDK trong máy tính của bạn, một hộp thoại yêu cầu chỉ rõ đường dẫn hoặc cài đặt JDK xuất hiện. Nếu đã có JDK, bạn vui lòng trỏ đường dẫn đến nơi cài đặt. Sau đó nhấn Next. Chưa có hãy nhấn vào link xanh và download về. Hộp thoại lựa chọn cấu hình cài đặt sẽ mở ra Bạn vui lòng check như hình trên để tránh thiếu sót về sau. Sau đó nhấn Next để tiếp tục. Hộp loại thông báo các điều khoản và một số lưu ý khi sử dụng Android Studio xuất hiện 19

20 Nhấn I Agree để tiếp tục. Hộp thoại yêu cầu chọn nơi cài đặt Android Studio và Android SDK xuất hiện. Bạn nên để đường dẫn mặc định như trên, sau đó nhấn Next để tiếp tục quá trình cài đặt. Hộp thoại chọn Start Menu xuất hiện, chọn Android Studio và nhấn vào Installl để tiếp tục quá trình cài đặt 20

21 Chờ đợi quá trình cài đặt Khi quá trình cài đặt hoàn tất, nhấn Next để tiếp tục. 21

22 Hộp thoại cuối cùng của quá trình cài đặt xuất hiện Nhấn check vào Start Android Studio, và Finish. Trong quá trình khởi động, nếu có thông báo thiếu JDK, bạn vui lòng cài JDK 7 bản x64 và khởi động lại Android Studio. 22

23 Ở lần khởi động đầu tiên, một hộp thoại import bản Android Studio cũ xuất hiện, nếu bạn cài đặt mới, vui lòng chọn như hình dưới. Nhấn OK và tiếp tục. Ở lần đầu tiên, bạn sẽ phải update một vài thứ cho quá trình làm việc sau này. Vui lòng chờ đợi cho đến khi hoàn tất. Đợi một lúc và nhấn tiếp Finish. Quá trình download file bắt đầu. 23

24 Khi hoàn tất quá trình download, nhấn Finish để kết thúc. Vậy là bạn đã hoàn thành quá trình cái đặt Khi cài đặt thành công Android Studio thì Android Studio tạo sẵn chúng cho chúng ta máy ảo rồi. Bạn có thể khởi động máy ảo này ngay hoặc chỉnh sửa lại thông số trước khi chạy máy ảo. Tuy nhiên nếu máy ảo không chạy được và báo lỗi hoặc khi chạy một ứng dụng Android Studio báo lỗi: Điều này có nghĩa máy tính của bạn chưa bật tính năng hỗ trợ chạy máy ảo Android. Để khắc phục cần làm như sau: 24

25 Bạn mở Android SDK Manager lên - theo như đường dẫn ở đầu bài là: D:\Android\sdk, tìm tới folder extras\intel\hardware_accelerated_execution_manager Sau đó chọn cài đặt file intelhaxm-android.exe. Nếu hộp thoại sau xuất hiện: Điều này có nghĩa máy tính của bạn đang bị xung đột giữa các công nghệ ảo hóa với nhau, mà trong trường hợp này là Hyper-V của Microsoft. Để tắt Hyper-V, 25

26 bạn vào Control Panel > Program and Features > Turn Windows feature on or off và tiến hành tắt Hyper-V như hình bên dưới: Sau đó bạn khởi động lại máy và tiến hành chạy lại file cài đặt Intel HAXM. Hộp thoại thông báo cài đặt Intel HAXM xuất hiện. Nhấn Next để tiếp tục. 26

27 Cấu hình nên để mặc định của hệ thống và nhấn Next. Nhấn Install và chờ đợi quá trình cài đặt. 27

28 thành công. Nhấn Finish để kết thúc quá trình cài đặt. Bây giờ bạn có thể build lại project 28

29 Quản lý Android SDK Manager: Để quản lý SDK Manager (các bộ thư viện mà chúng ta dùng lập trình) chúng ta vào: Tools Android SDK Manager hoặc nhấn biểu tượng SDK Manager ngoài Toolbar. Install. Chúng ta muốn lập trình trên API nào thì chúng ta check chọn và nhấn 29

30 1.7. Thiết bị ảo (AVD - Android Virtual Device) Máy ảo Android dùng để chạy các ứng dụng Android trong trường hợp bạn không có thiết bị Android thật để chạy. Để tạo máy ảo Android bạn có thể làm theo thứ tự: Vào Menu Tool Android AVD Manager hoặc nhấn vào biểu tượng AVD manager trên Toolbar AVD Manager hiện lên các máy ảo hiện có của Android Studio. Để tạo một máy ảo mới bạn chỉ cần nhấn vào Create Vitual Device... và làm theo hướng dẫn: 30

31 31

32 32

33 33

34 1.8. Debugging trên Android Studio Nhiều người chuyển từ J2SE hoặc J2ME sang Android sẽ ngạc nhiên vì câu lệnh debug kinh điển System.out.println() không còn in ra trên cửa sổ Console nữa. Google đã thay thế nó bằng Logcat, một cửa sổ ghi lại toàn bộ hoạt động của hệ điều hành. Để mở Logcat, trước tiên các bạn chọn Window Open Perspective Debug. Nếu ko thấy option Debug thì chọn Other và tìm Debug trong cửa sổ mới hiện ra. Sau đó chọn tab Debug mới xuất hiện ở góc trên bên phải của Eclipse (xem hình). Theo kinh nghiệm của mình thì tốt nhất là Maximize Logcat ra luôn cho dễ quan sát. Cảm nhận ngày xưa khi mới sử dụng Logcat là rối và khó dùng. Nhưng càng về sau mình càng quen và thấy nó tiện hơn Console nhiều, vì Console chỉ đưa ra thông báo do chúng ta gọi, còn Logcat thì đưa cả luôn những thông báo của hệ điều hành, giúp chúng ta nắm được hệ điều hành đang làm gì, gọi đến cái gì, khởi chạy những gì 1.9. Website hữu ích dành cho người lập trình Một số website dành cho người lập trình Android: - Android developer website: - Java2S: - Google: Google is all - Ebook: Android Advanced Tutorial 34

35 BÀI 2. CHƯƠNG TRÌNH HELLO WORLD 2.1. Tạo ứng dụng Android đầu tiên Khởi động Android Studio, trong hộp thoại Welcome to Android Studio, chọn Start a new Android Studio project để tạo 1 project mới. Hộp thoại đặt tên ứng dụng và tên domain xuất hiện. 35

36 Trong hộp thoại này: - Application name: là tên của ứng dụng. - Company Domain: là tên domain của công ty. Kết hợp với tên của ứng dụng để tạo ra package. Cái này sử dụng để upload ứng dụng của bạn lên store. - Pakage name: Tên của gói ứng dụng của bạn. Dùng để phân biệt khi với các gói khác trên store. - Project location: Nơi lưu trữ ứng dụng của bạn (thường mình để khác ổ C). Sau khi nhập xong thông tin (bao gồm tên ứng dụng, domain và nơi lưu project), nhấn Next để tiếp tục. Hộp thoại chọn device mà bạn muốn phát triển ứng dụng xuất hiện. Bạn chọn như hình trên nếu muốn phát triển ứng dụng trên phone và tablet. Sau đó nhấn Next để tiếp tục. 36

37 hiện. Chọn Blank Activity và nhấn Next. Hộp thoại nhập thông tin của Activity xuất Trong hộp thoại này - Activity Name: Tên lớp lưu giữ mã nguồn. - Layout Name: Tên file XML làm giao diện cho Activity Name. - Title: Tên tiêu đề, sẽ hiển thị khi kích hoạt activity trên device. - Menu Resource Name: Tên file xml để tạo menu cho phần mềm. 37

38 Sau khi nhập đầy đủ thông tin, nhấn Finish để kết thúc. Chờ building project. Quá trình tạo project đến đây là kết thúc. Giao diện ứng dụng HelloWorld khi mới tạo ra: 38

39 2.2. Cấu trúc một ứng dụng Android PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG Về cơ bản giao diện một Project trong Android có thể chia làm 6 vùng cơ bản theo chức năng: Vùng 1: Hiển thị cấu trúc của một ứng dụng Android Chức năng một số thư mục/ file trong cấu trúc này: - manifests: là file xml lưu trữ các thông tin cấu hình của ứng dụng. file này tương tự file web.config trong lập trình web. Một ứng dụng Android muốn truy cập Internet, làm việc với SD card cần phải được cấu hình trong manifests. 39

40 o tab application: định nghĩa thành phần của ứng dụng sử dụng. o android:icon: trỏ đến file ảnh icon của ứng dụng. Ví dụ trong hình trên icon đang sử dụng có tên là ic_launcher được đặt trong thư mục drawable (tùy thuộc loại màn hình mà ứng dụng sẽ load file có tên ic_launcher trong thư mục drawable- tương ứng (như đã mô tả ở trên) o android:label: nhãn của ứng dụng, trỏ đến thành phần có tên app_name trong file string.xml. o android:theme: định nghĩa kiểu giao diện ứng dụng, trỏ đến thành phần có tên AppThêm trong file stypes.xm. o tag Activity: định nghĩa các activity của ứng dụng. Trong bài kế tiếp sau sẽ nói kỹ về tag này và các thành phần trong tag này. o android:name: tên của Activity khởi tạo chạy ứng dụng. Trong ứng dụng bài 2, Activity này có tên là MainActivity, thực chất là một file java. Chúng ta sẽ đi kỹ hơn về Activity trong những bài kế tiếp. - Thư mục java: Thư mục này chứa các source nguồn của ứng dụng. Bạn có thể thêm bao nhiêu package và các class java vào trong các package này tùy thích. - Thư mục res\drawable: Lưu trữ các file ảnh có cùng nội dung nhưng có độ phân giải và kích thước khác nhau, phục vụ cho mục đích hiển thị trên các loại màn hình có kích thước và độ phân giải khác nhau sao cho trông ứng dụng luôn hiển thị giống nhau trên các loại màn hình này. Chúng ta sẽ đi sâu tìm hiểu về các thư mục này trong các bài học kế tiếp - Thư mục res\layout: Lưu trữ layout của ứng dụng dưới định dạng xml. Chúng ta sẽ đi sâu tìm hiểu các loại layout trong bài học kế tiếp. 40

41 - Thư mục res\menu: Lưu trữ các loại menu của ứng dụng dưới định dạng xml. Chúng ta sẽ đi sâu vào tìm hiểu các loại menu trong những bài học kế tiếp - Thư mục res\values: Lưu trữ các hằng số định nghĩa sẵn cho ứng dụng (định nghĩa màu sắc sử dụng ) Vùng 2: Là vùng hiển thị các Control mà Android hỗ trợ, cho phép bạn kéo thả trực tiếp vào vùng 3 (vùng thiết kế giao diện) để thiết kế giao diện ứng dụng. Vùng này tương tự công cụ Toolbox trong Visual Studio. Vùng 3: Là vùng giao diện thiết bị, cho phép các Control kéo thả vào đây. Đây chính là vùng thiết kế giao diện ứng dụng. Ở vùng số 3 này nó có 2 tab: Design và Text ở góc trái dưới cùng. - Tab Design là tab mà bạn đang nhìn và thao tác với nó, cho phép thiết kế giao diện bằng cách kéo thả. - Tab Text là tab cho phép ta thiết kế giao diện bằng viết XML. Vùng 4: Hiển thị cấu trúc Layout và các điều khiển đã dùng thiết kế ứng dụng Android. Vùng 5: Vùng này tương tự công cụ Properties trong lập trình Windows Form. Cho phép người dùng thay đổi thuộc tính của Control trong Android. Tất nhiên chúng ta luôn có 2 các tác động vào một Control: - Thông qua công cụ Properties (sử dụng tab Design) - Thông qua tệp XML (sử dụng tab Text) Vùng 6: Công cụ Toolbar trên Android Studio cho phép người dùng thao tác nhanh với các tác vụ (chạy ứng dụng, AVD Manager, SDK Manager...) 2.3. Chạy ứng dụng trên AVD Mẹo: Để đỡ mất thời gian khi chạy ứng dụng Android HelloWorld hay tất cả các ứng dụng Android về sau, chúng ta khởi động Máy ảo trước khi chạy ứng dụng và cứ để đó trong suốt thời gian bạn làm việc với Android Studio để chạy các ứng dụng. Để khởi động máy ảo AVD chỉ cần vào AVD Manager chọn máy ảo cần làm việc và khởi động. 41

42 Sau đó để chạy ứng dụng chúng ta có thể sử dụng một trong 3 cách: - Nhấn biểu tượng Run trên thanh Toolbar - Vào menu Run/Run App (nhấn Shift + F10) - Vào menu Run/Run (nhấn Alt + Shift + F10) 42

43 Màn hình ra như sau (ở đây mình đã khởi động sẵn máy ảo fitutehy rồi): Nhấn OK và kết quả như sau: 43

44 2.4. Chạy ứng dụng trên Mobile Phone Để chạy ứng dụng trên máy thật (cụ thể ở đây mình dùng điện thoại SamSung Galaxy S3 GT9300) bạn chỉ cần kết nối máy tính với điện thoại của bạn bằng một cab USB. Để chạy ứng dụng trên máy thật (SamSung Galaxy S3 GT9300) bạn chỉ cần nhấn nút Run và lựa chọn thiết bị mô phỏng (ở đây do mình chưa tắt máy ảo fitutehy nên nó hiển thị nên cả 2 thiết bị sẵn sàng chờ mô phỏng: một thiết bị thật và một thiết bị ảo): Chú ý: Khi kết nối điện thoại với cáp và chạy ứng dụng Android, nếu Android Studio không nhận ra thiết bị của bạn thì có thể do điện thoại của bạn chưa kích hoạch chế độ USB debugging. Để kích hoạch chế độ này trên điện thoại của bạn chúng ta có thể làm như sau: - Với các phiên bản Android thấp hơn 4.0 ta sẽ vào Settings Applications Development sau đó kích hoạt USB debugging - Với các phiên bản Android caos chúng ta sẽ vào Setting Developer options sau đó kích hoạt USB debugging 44

45 2.5. Một số phím tắt hữu dụng trong lập trình Android - Ctrt + Y ( tương đương Shift + Delete): Xóa 1 dòng tại con trỏ. - Ctrl + F11: quay ngang màn hình AVD. - Ctrl + Space: hiển thị bảng Suggestion (tương tự C#). - Ctrl + Alt + L: định dạng lại code cho chuẩn (đẹp). - Ctrl + /: Comment, uncomment một dòng. - Ctrl + Shift + /: comment, uncomment một đoạn code. - Ctrl + G: đưa con trở đến 1 dòng nào đó, rất hữu ích với 1 file dài. - Ctrl + F9: Build ứng dụng - Shift + F10: Buid và chạy ứng dụng. 45

46 BÀI 3. LÀM VIỆC VỚI LAYOUT 3.1. Giới thiệu về XML XML là gì? XML viết tắt của chữ extensible Markup Language (ngôn ngữ nâng cấp có thể mở rộng) là một bộ qui luật về cách chia một tài liệu ra làm nhiều phần, rồi đánh dấu và ráp các phần khác nhau lại để dễ nhận diện chúng. Tổ hợp Web toàn cầu W3C gọi XML là "một cú pháp thông dụng cho việc biểu thị cấu trúc trong dữ liệu". Dữ liệu có cấu trúc tham chiếu đến dữ liệu được gán nhãn cho nội dung, ý nghĩa, hoặc công dụng. XML có cấu trúc giống như HTML tuy nhiên HTML sử dụng những thẻ được định nghĩa trước (trong một tài liệu html không thể sử dụng thẻ do người dùng định nghĩa), còn trong trang XML hoàn toàn có thể sử dụng những thẻ do người dùng định nghĩa Cú pháp XML Một trang XML phải tuân thủ các quy luật sau: - Một trang XML phải bắt đầu bằng XML. - Phải có một root (gốc) Element duy nhất, gọi là Document Element, nó chứa tất cả các Elements khác trong tài liệu. - Mỗi Child Element phải nằm trọn bên trong Element cha của nó. - Mỗi opening Tag phải có một closing Tag giống như nó (Nếu Tag nào không chứa gì ở giữa thì phải chấm dứt bằng "/>", thí dụ như <BR/>, <HR/> ). opening Tag và closing Tag phải được đánh vần y như nhau, chữ hoa hay chữ thường. - Các Tag không được xen kẽ nhau (thí dụ như <Class>TK12<Lop>TK12</Class></Lop> là bất hợp lệ vì <Lop> nằm trong Tag Class). - Giá trị Attribute trong XML phải được gói giữa một cặp ngoặc kép. 46

47 3.2. Giới thiệu về Layout Layout định nghĩa cấu trúc cho một giao diện người dùng, mỗi một layout cho phép người dùng thiết kế giao diện ứng dụng trên nó. Mỗi một Layout trong Android tương ứng là một Form trong lập trình Windows Form C#. một giao diện (trang) người dùng = giao diện + code cho giao diện đó Trong C#: Trong Android Studio: file giao diện và code cho giao diện đó được đặt ở hai nơi khác nhau. Các bạn có thể xem trong hình. Chúng ta có thể xem và thiết kế giao diện người dùng (giao diện Layout) theo 2 cách (tùy theo việc người dùng chọn Tab Design hoặc tab Text ở vùng 3): - Giao diện đồ họa - Giao diện dạng cấu trúc tệp XML 47

48 - Một số loại Layout cơ bản trong Android Studio: - FrameLayout - LinearLayout - TableLayout - RelativeLayout - AbsoluteLayout Chú ý: Một trang giao diện người dùng không nhất thiết chỉ sử dụng 1 loại Layout mà có thể sử dụng nhiều loại Layout kết hợp với nhau để tạo giao diện Cách tạo Layout trong một dự án Android Mỗi Layout giống như một Form trong lập trình NET. Tất cả các Layout được chứa trong thư mục layout của dự án Android. Để tạo một Layout chúng ta làm như sau: Bước 1: Nhấn chuột phải (right click) vào thư mục Layout chọn New chọn Layout resource file 48

49 Bước 2: Đặt tên Layout trong mục File name và chọn kiểu Layout trong mục Root element (kiểu Frame Layout, Table Layout ) 49

50 Bước 3: Layout bạn tạo sẽ được hiển thị ra thư mục layout của ứng dụng Android Frame Layout - Đặc điểm: Frame Layout là loại Layout cơ bản nhất, đặc điểm của nó là chúng ta chỉ khi gắn các control vào một trong các Frame con của Frame Layout (Frame Layout chia Layout thành 9 frame con). Nếu chúng ta đưa hai điều khiển vào cùng một frame thì điều khiển sau sẽ đè lên điều khiển trước. 50

51 - Ví dụ: Một thiết kế sử dụng Frame Layout <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent"> <RadioButton android:layout_height="wrap_content" android:textsize="8pt" android:text="i living in Hung Yen" android:layout_gravity="right center_vertical" /> <RadioButton android:layout_height="wrap_content" android:text="i lived in Hung Yen" android:textsize="8pt" android:layout_gravity="left bottom" /> <RadioButton android:layout_height="wrap_content" android:textsize="8pt" android:text="i live in Hung Yen" 51

52 android:layout_gravity="right bottom" /> <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="present Simple" android:layout_gravity="center_horizontal top" /> <RadioButton android:layout_height="wrap_content" android:textsize="8pt" android:text="i lives in Hung Yen" android:layout_gravity="left center_vertical" /> </FrameLayout> 3.5. Linear Layout - Đặc điểm: Layout này cho phép sắp xếp các control theo hai hướng trên giao diện: Hướng từ trái qua phải (khi chúng ta đặt thuộc tính android:orientation="horizontal"): tất cả các điều khiển chứa trên một dòng và sắp xếp từ trái qua phải. Hướng từ trên xuống dưới (khi chúng ta đặt thuộc tính android:orientation="vertical"): mỗi một điều khiển được chứa trên một dòng và sắp xếp lần lượt từ trên xuống dưới. Tại mỗi dòng này ta có thể căn lề mỗi điều khiển Trái, giữa hoặc phải - Ví dụ: android:orientation="horizontal" 52

53 android:orientation="vertical" android:orientation="vertical" và căn lề các điều khiển 3.6. Table Layout TableLayout là sự mở rộng của LinearLayout. Cấu trúc kiểu hiển thị này là các điều khiển con được đặt các hàng và các cột. Dưới đây là ví dụ: <TableLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <TextView android:layout_height="wrap_content" android:text="first Name:"/> <EditText android:layout_height="wrap_content" android:text="barack"/> </TableRow> <TableRow> <TextView 53

54 android:layout_height="wrap_content" android:text="last Name:"/> <EditText android:layout_height="wrap_content" android:text="obama"/> </TableRow> </TableLayout> Để sử dụng TableLayout, bạn tạo một thể hiện của lớp TableLayout và đặt TableRow bên trong nó. Các phần tử TableRow chứa các điều khiển của bảng. Dưới đây là ảnh minh họa Do các nội dung của một TableLayout được định nghĩa bởi các hàng và các cột, Android quyết định số của các cột trong bảng bằng việc tìm kiếm hàng cùng với các ô (cells). Ví dụ, hình bên dưới tạo một bảng cùng với hai hàng, trong đó một hàng có hai ô và một hàn có ba ô. Trong trường hợp này Android tạo một bảng cùng với hai hàng và ba cột. 54

55 <TableLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <TextView android:layout_height="wrap_content" android:text="first Name:"/> <EditText android:layout_height="wrap_content" android:text="barack"/> </TableRow> <TableRow> <TextView android:layout_height="wrap_content" android:text="last Name:"/> <EditText android:layout_height="wrap_content" android:text="hussein"/> <EditText android:layout_height="wrap_content" android:text="obama"/> </TableRow> </TableLayout> Bạn có thể sử dụng lớp android.widget.view để tạo ra bảng như ví dụ trên. Trong mã lệnh bên dưới, chúng ta sẽ tạo một bảng có hàng đầu tiên là một EditText. <TableLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchcolumns="0,1,2"> <EditText android:text="full Name:"/> 55

56 <TableRow> <TextView android:layout_height="wrap_content" android:text="barack"/> <TextView android:layout_height="wrap_content" android:text="hussein"/> <TextView android:layout_height="wrap_content" android:text="obama"/> </TableRow> </TableLayout> - Sử dụng android:padding Bạn có thể cần khoảng trắng bên trong các nội dung của một ô hoặc một điều khiển. Android SDK hỗ trợ thông qua thuộc tính android:padding, thuộc tính này thiết lập khoảng cách giữa điều khiển của bạn và đường bao của điều khiển chứa nó. <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <EditText android:layout_height="wrap_content" android:text="one" android:padding="40px" /> </LinearLayout> 56

57 Các đơn vị được Android hỗ trợ: - Pixels: được định nghĩa là px - Inches: được định nghĩa là in - Millimeters: được định nghĩa là mm - Divice-independent pixels: được định nghĩa là dip hoặc dp - Scale pixels: được định nghĩa là sp 3.7. Relative Layout Một kiểu layout khá thú vị là RelativeLayout. Như tên của nó, layout này triển khai một cơ chế hiển thị nơi các điều khiển trong khung chứa nằm tương đối với các điều khiển khác. <RelativeLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/usernamelbl" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="username: " android:layout_alignparenttop="true" /> <EditText android:id="@+id/usernametext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/usernamelbl" /> <TextView android:id="@+id/pwdlbl" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@id/usernametext" android:text="password: " /> 57

58 <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="password Criteria... " /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignparentbottom="true" android:text="use at your own risk... " /> </RelativeLayout> 58

59 Như hiển thị ở trên, giao diện người dùng giống như một login form đơn giản. Nhãn username được đạt ở trên cùng của khung chứa vì chúng ta thiết đặt android:layout_alignparenttop là true. Tương tự, hộp text nhập username được đặt phía dưới username label vì chúng ta thiết đặt android:layout_bellow. Ô nhập mật khẩu xuất hiện bên dưới username vì chúng ta thiết đặt thuộc tính android:layout_alignparentbottom là true Absolute Layout Dạng layout này cho phép người dùng đặt chính xác vị trí của các điều khiển trong khung chứa. <AbsoluteLayout android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android=" <TextView android:layout_height="wrap_content" android:text="username:" android:layout_x="50px" android:layout_y="50px" /> <EditText android:layout_height="wrap_content" android:layout_x="160px" android:layout_y="50px" /> <TextView android:layout_height="wrap_content" android:text="password:" android:layout_x="50px" android:layout_y="100px" /> <EditText 59

60 android:layout_height="wrap_content" android:layout_x="160px" android:layout_y="100px" /> </AbsoluteLayout> Bên cạnh đó, chúng ta cũng có thể sử dụng dạng layout này một cách tự động trong mã lệnh như ví dụ sau: public void oncreate(bundle icicle){ super.oncreate(icicle); ImageView img = new ImageView(this); imgsetimageresource(r.drawable.myimage); AbsoluteLayout al = new AbsoluteLayout(this); mcontentview.addview(img, new AbsoluteLayout.LayoutParams( 50, // width 50, //height 0, //left 0); //top setcontentview(al); 60

61 BÀI 4: THẢO LUẬN/BÀI TẬP 01: ANDROID LAYOUT BÀI 5. ACTIVITY VÀ INTENT 5.1. Khái niệm Activity Đơn giản chúng ta có thể hiểu một Activity là một file mã nguồn Java viết để xử lý hành vi cho một Layout. Trong ví dụ HelloWorld ở trên thì file MainActivity được tạo ra để xử lý cho layout activity_main.xml (trong thư mục layout) Mã nguồn cơ bản của file Main Activity khi mới được tạo ra: Trong đó chúng ta chú ý: 61

62 - Phương thức OnCreate (đánh dấu mục số 1): Tương tự như phương thức Form_Load của một Form trong lập trình Windows Form. Phương thức này sẽ được thực thi khi Layout chạy. - Dòng lệnh SetContentView (R.Layout.activity_main): thiết lập Layout nào được gọi (được hiển thị). - Các phương thức OnCreateOptionsMenu và onopntionsitemselected: xử lý về Menu. Nếu ứng dụng không làm việc với menu thì có thể xóa đi cũng được. Để thêm một Activity vào ứng dụng chúng ta chỉ cần right click vào thư mục package của ứng dụng và chọn New Java class 5.2. Cách tạo Activity và kết nối với Layout Một ứng dụng Android không chỉ có duy nhất một Layout (Form) mà có nhiều Layout, vậy làm thế nào để tạo nhiều Layout, tạo nhiều Activity, và kết nối Activity với Layout. Đây cũng chính là vấn đề mà rất nhiều lập trình Android mới thắc mắc và muốn tìm hiểu. Trong C# thì làm điều đó rất đơn giản, còn Android thì hơi phức tạp hơn một chút. Để minh họa cho điều này chúng ta làm một ví dụ minh họa: Yêu cầu: thiết kế ứng dụng Android bao gồm 3 Layout, layout chính có giao diện như sau: 62

63 Layout chính bao gồm hai Button. Khi nhấn vào Button INTENT 1 và Button INTENT 2 thì hiển thị Layout 1 và layout 2 lần lượt có giao diện sau: Tại Layout 1 và Layout 2 khi nhấn vào Button BACK LAYOUT MAIN thì quay trở lại layout chính ở trên. Giải quyết: để làm điều này chúng ta thực hiện lần lượt 4 bước như sau: - Bước 1: Tạo dự án Android Studio (tùy bạn đặt tên) sau đó tạo 3 layout lần lượt có tên main.xml, layout1.xml, layout2.xml và 3 Activity lần lượt có tên như sau MainActivity, layout1activity, layout2activity (MainActivity viết cho main.xml, layout1activity viết cho layout1, layout2activity viết cho layout2). 63

64 - Bước 2: Thiết kế giao diện cho các Layout main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="activity INTENT" android:layout_gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:text="intent 1" android:layout_gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:text="intent 2" 64

65 android:layout_gravity="center_horizontal" /> </LinearLayout> Layout1.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="layout 1" android:layout_gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:text="back layout main" android:layout_gravity="center_horizontal" /> </LinearLayout> Layout2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="layout 2" android:layout_gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:text="back layout main" android:layout_gravity="center_horizontal" /> </LinearLayout> 65

66 - Bước 3: Viết code cho các Activity PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG MainActivity public class MainActivity extends ActionBarActivity protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); // Button btn1 = (Button) findviewbyid(r.id.btintent1); Button btn2 = (Button) findviewbyid(r.id.btintent2); //Button1 btn1.setonclicklistener(new View.OnClickListener() public void onclick(view v) { Intent in = new Intent(v.getContext(), layout1activity.class); startactivity(in); ); //Button2 btn2.setonclicklistener(new View.OnClickListener() public void onclick(view v) { Intent in = new Intent(v.getContext(), layout2activity.class); startactivity(in); ); layout1activity public class layout1activity extends ActionBarActivity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.layout1); // Button btn = (Button) findviewbyid(r.id.btback); btn.setonclicklistener(new View.OnClickListener() public void onclick(view v) { Intent in = new Intent(v.getContext(), MainActivity.class); startactivity(in); ); 66

67 layout2activity public class layout2activity extends ActionBarActivity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.layout2); // Button btn = (Button) findviewbyid(r.id.btback); btn.setonclicklistener(new View.OnClickListener() public void onclick(view v) { Intent in = new Intent(v.getContext(), MainActivity.class); startactivity(in); ); - Bước 4: Khai báo Activity trong AndroidManifest.xml (bước này rất quan trọng) xem hai dòng lệnh trong khung. AndroidManifest.xml Nếu không có dòng lệnh trên sau khi nhấn Button chương trình sẽ báo lỗi: 67

68 5.3. Các kiểu xử lý sự kiện trong Android Trong C# việc viết sự kiện cho các điều khiển đơn giản hơn so với Android. Ví dụ: Chúng ta có một Form: Để viết sự kiện cho Button Test chúng ta chỉ việc double click vào Button, Visual Studio sẽ tự động sinh cho chúng ta sự kiện click của Button đó trên file code. private void bttest_click(object sender, EventArgs e) { Còn trong Android chúng ta không làm được như vậy. Có nhiều cách để viết sự kiện cho một điều khiển trong Android, ở đây mình giới thiệu 2 cách hay dùng nhất: 68

69 - Onclick in XML - Inline anonymous listener Để minh họa cho 2 cách viết trên chúng ta chỉ cần lấy ví dụ đơn: Thiết kế giao diện như bên dưới, khi nhấn vào Button thì hiển thị một MessageBox có nội dung "KHOA CNTT - ĐHSPKT HƯNG YÊN". Cấu trúc Project: Mã nguồn MainActivity và activity_main.xml ban đầu: activity_main.xml <RelativeLayout> <Button android:layout_height="wrap_content" android:text="it - UTEHY" android:id="@+id/btdemo" 69

70 android:layout_margintop="126dp" android:layout_alignparenttop="true" android:layout_centerhorizontal="true" /> </RelativeLayout> MainActivity Onclick in XML: Viết một phương thức riêng minh họa cho sự kiện của điều khiển (ở đây là Button, các điều khiển khác tương tự). Sau đó gọi phương thức này trong thuộc tính của điều khiển ở file XML Layout. - Bước 1: Viết phương thức minh họa sự kiện của Button (viết trong MainActivity): - Bước 2: gọi phương thức này trong thuộc tính của điều khiển ở file XML Layout (activity_main.xml) 70

71 Kết quả khi chạy ứng dụng trên máy ảo: Inline anonymous listener: Chúng ta chỉ cần viết một phương thức trong sự kiện oncreate và không phải viết ra phương thức riêng và cũng không cần thiết lập sự kiện onclick trong tập xml layout. 71

72 Bỏ dòng lệnh: OnClickandroid:onClick="OnClickButton" Tùy theo thói quen của người lập trình mà người lập trình có thể chọn theo Onclick in XML hay Inline anonymous listener 5.4. Truyền dữ liệu giữa các Activity Để truyền dữ liệu giữa các các Activity chúng ta có thể sử dụng Intent. Để hiểu rõ hơn các bạn có thể tham khảo ví dụ sau: Yêu cầu: Viết chương trình tính tổng hai số, kết quả được hiển thị trên Layout khác Các bạn có thể tham khảo hướng dẫn sau: - Cấu trúc ứng dụng: - Layout Main: <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:id="@+id/tablerow1" android:gravity="center" 72

73 android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="tổng HAI SỐ" android:textappearance="?android:attr/textappearancelarge" /> </TableRow> <TableRow android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="sô a:" /> <EditText android:layout_height="wrap_content" android:ems="10" /> </TableRow> <TableRow android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="số b:" /> <EditText android:layout_height="wrap_content" android:ems="10" > 73

74 <requestfocus /> </EditText> </TableRow> <TableRow android:gravity="center" android:layout_height="wrap_content" > <Button android:onclick="dangnhap" android:layout_height="wrap_content" android:text="ok" /> </TableRow> </TableLayout> package com.example.hoangquocviet.intent; import android.content.intent; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.view; import android.widget.button; import android.widget.edittext; public class MainActivity extends ActionBarActivity { EditText txta, txtb; Button protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); // txta = (EditText) findviewbyid(r.id.txta); txtb = (EditText) findviewbyid(r.id.txtb); btnok = (Button) findviewbyid(r.id.btok); // btnok.setonclicklistener(new View.OnClickListener() { 74

75 public void onclick(view arg0) { //Tạo Intent để mở ResultActivity Intent myintent = new Intent(MainActivity.this, layout2_activity.class); //Khai báo Bundle Bundle bundle = new Bundle(); int a = Integer.parseInt(txta.getText().toString()); int b = Integer.parseInt(txtb.getText().toString()); //đưa dữ liệu riêng lẻ vào Bundle bundle.putint("soa", a); bundle.putint("sob", b); //Đưa Bundle vào Intent myintent.putextra("mypackage", bundle); //Mở Activity ResultActivity startactivity(myintent); ); - Layout 2: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="kết QUẢ" android:id="@+id/textview" android:layout_gravity="center_horizontal" /> <TextView android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:id="@+id/tvkq" android:background="#fc1213" android:layout_gravity="center_horizontal" /> <Button android:layout_height="wrap_content" android:text="back" android:id="@+id/btback" 75

76 android:layout_gravity="center_horizontal" /> </LinearLayout> package com.example.hoangquocviet.intent; import android.content.intent; import android.os.bundle; import android.support.v7.app.actionbaractivity; import android.view.view; import android.widget.button; import android.widget.textview; /** * Created by Hoang Quoc Viet on */ public class layout2_activity extends ActionBarActivity { TextView tvketqua; Button protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.layout2); btnback=(button) findviewbyid(r.id.btback); tvketqua=(textview) findviewbyid(r.id.tvkq); //lấy intent gọi Activity này Intent callerintent=getintent(); //có intent rồi thì lấy Bundle dựa vào MyPackage Bundle packagefromcaller= callerintent.getbundleextra("mypackage"); //Có Bundle rồi thì lấy các thông số dựa vào soa, sob int a=packagefromcaller.getint("soa"); int b=packagefromcaller.getint("sob"); int kq=a+b; tvketqua.settext(kq+""); // btnback.setonclicklistener(new View.OnClickListener() { public void onclick(view v) { finish(); ); 76

77 BÀI 6. LÀM VIỆC VỚI TOAST, DIALOG VÀ NOTIFICATION 6.1. Giới thiệu Toast Notification và Alert Dialog trong Android dùng để xuất ra một thông báo nào đó hay bạn cũng có thể dùng để kiểm tra một điều gì khi lập trình ứng dụng cho Android. Các tiền trình của ứng dụng vẫn sẽ tiếp tục làm việc khi Toast và Alert Dialog hiện ra thông báo Toast - Toast là gì?: Toast là một dạng thông báo ngắn mặc định là chuỗi hiện lên trong một khoảng thời gian ngắn sau đó sẽ đóng lại. Toast có thể được tạo và hiển thị trong Activity hoặc trong Servive. - Khi nào nên sử dụng Toast: Bạn có thể sử dụng trong trường hợp hiển thông báo trong các mục thiết lập thông số cấu hình, hay đơn giản chỉ là hiển thị lên để xem thông tin tạm thời nào đó (giống như để kiểm tra một vấn đề sảy ra chẳng hạn). ví dụ: - Cú pháp tạo Toast: Cách 1: Toast toast=toast.maketext(youractivity.this, Hiển thị gì thì ghi ở đây, Toast.LENGTH_SHORT); toast.show(); Cách 2: Toast.makeText(YourActivity.this, Hiển thị gì thì ghi ở đây, Toast.LENGTH_SHORT).show(); Có 2 giá trị mặc định (ta nên sử dụng 2 giá trị này, không nên gõ con số cụ thể vào): hằng số Toast.LENGTH_SHORT hiển thị trong 2 giây, Toast.LENGTH_LONG hiển thị trong 3.5 giây. 77

78 6.3. Alert Dialog - Alert Dialog là gì?: Là một dạng của thông báo và cho phép người dùng tương tác, ví dụ: khi nhấn nút Cancel, chương trình sẽ hiển thị Alert Dialog hỏi xem có chắc chắn muốn xóa hay không? Bấm No thì không, bấm Yes thì tắt chương trình. //Viết ra phương thức riêng // Alert Dialog public void AlertDialog(View v) { // Dialog AlertDialog.Builder al = new AlertDialog.Builder(this); al.settitle("message"); // al.seticon(); al.setmessage("are you sure you want to exit?"); // Yes al.setpositivebutton("có", new DialogInterface.OnClickListener() public void onclick(dialoginterface dialog, int which) { // TODO Auto-generated method stub finish(); ); // No al.setnegativebutton("không", new DialogInterface.OnClickListener() public void onclick(dialoginterface dialog, int which) { // TODO Auto-generated method stub dialog.cancel(); ); al.create().show(); - Ý nghĩa của các hàm : o settitle : thiết lập tiêu đề cho Dialog o setmessage: Thiết lập nội dung cho Dialog 78

79 o seticon : để thiết lập Icon o setpositivebutton, setnegativebutton thiết lập hiển thị Nút chọn cho Dialog (ở đây bạn không quan tâm Nút chấp nhận hay Nút hủy nó thuộc PositiveButton hay NegativeButton vì đó là tùy thuộc bạn chọn. Chú ý là ở đối số thứ 2 của các hàm này sẽ là DialogInterface. OnClickListener chứ không phải View. OnClickListener o create() để tạo Dialog o show() để hiển thị Dialog Promt Dialog Tương tự như JavaScripts, Android hỗ trợ Promt dialog cho phép người dùng Tạo Message tương tác với người dùng qua hộp thoại. Để hiển thị Promt Dialog chúng ta có thể tham khảo đoạn code sau: // Input Dialog public void PromtDialog (View v) { int a,b; // final EditText result = (EditText) findviewbyid(r.id.edtinput); final EditText input = new EditText(this); // Hiển thị MessageBox AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setmessage("promtdialog"); alert.setview(input); // alert.setpositivebutton("ok", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { String value = input.gettext() + ""; result.settext(value); a=integer.parseint(value); ); alert.create().show(); // Để hiểu rõ hơn về Promt Dialog chúng ta có thể tham khảo bài toán sau: Cho Layout có giao diện như sau: 79

80 Yêu cầu: Viết code thực hiện các công việc sau: - Khi Layout được Load thì hiển thị hai InputDialog cho phép người dùng nhập vào giá trị của a, b của phương trình bậc nhất một ẩn ax + b = 0. - Khi người dùng nhấn OK thì lấy giá trị trong InputDialog gán cho hai hệ số a, b tương ứng. - Giải phương trình và hiển thị kết quả lên màn hình (dưới dạng Alert Dialog). Hướng dẫn: // Input Dialog int a, b; public void InputDialog(View v) { final EditText result = (EditText) findviewbyid(r.id.edtinput); final EditText input = new EditText(this); // Hiển thị MessageBox nhập a AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setmessage("nhập hệ số a: "); alert.setview(input); alert.setpositivebutton("ok", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { String value = input.gettext() + ""; a = Integer.parseInt(value); ); alert.create().show(); // Hiển thị MessageBox nhập b final EditText input2 = new EditText(this); AlertDialog.Builder alert2 = new AlertDialog.Builder(this); alert2.setmessage("nhập hệ số b:"); alert2.setview(input2); alert2.setpositivebutton("ok", new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { String value = input2.gettext() + ""; b = Integer.parseInt(value); 80

81 ); alert2.create().show(); //Tính nghiệm //Sinh viên tự làm nốt PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG 81

82 BÀI 7. CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1) 7.1. Giới thiệu View Các Control trong Android Studio được chia làm các Tab riêng biệt theo chức năng của Control (tương tự Visual Studio) Các control và view cơ bản sử dụng nhiều trong Android: - Nhóm điều khiển TextView: hiển thị một nhãn hay chuỗi ký tự. - Nhóm điều khiển Button: nút nhấn cho phép người dùng thao tác các chức năng sử dụng. 82

83 - Nhóm điều khiển EditText: cho phép người dùng nhập / hiển thị nội dung (ký tự, chuôi, số ). - CheckBox: có chức năng cho phép người dùng tích vào các mục muốn lựa chọn. - RadioButton: cũng là một dạng lựa chọn cho người dùng nhưng việc lựa chọn là chọn một trong số các RadioButton, khi lựa chọn thì các RadioButton khác sẽ không được lựa chọn. - ListView: hiển thị danh sách theo chiều dọc của layout (danh sách có thể là các dòng text hoặc hình ảnh + text v.v). - GridView: tương tự như ListView nhưng các thành phần bên trong được xắp xếp theo 2 chiều, giống như các ô lưới (các thành phần bên trong giống như ListView). - ImageView: dùng để hiển thị một hình ảnh nào đó. - ImageButton: dùng để hiển thị button dưới dạng hình ảnh như nút back, exit - ProgressBar: hiển thị thanh xử lý như download, loading v.v - RatingBar: thanh bình chọn theo sao, có thể tạo ra nhiều sao tùy người dùng. - Spinner: hiển thị lựa chọn, xổ xuống 1 danh sách các lựa chọn cho người dùng Nhóm điều khiển TextView - Chức năng: nhóm điều khiển TextView bao gồm 4 điều khiển (Plain TextView, Large Text, Medium Text, Small Text) có chức năng như Label trong C#. Cho phép hiển thị thông tin mà không chỉnh sửa được. - Một số thuộc tính thường dùng: o layout:width : chiều rộng của control (Tính theo trục Ox từ góc trên bên trái qua phải).có 3 thuộc tính: wrap_content (Co dãn theo nội dung control), match_parent (tự dãn ra cho đầy với control chứa nó parent), fill_parent (cũng tương tự như match_parent) o layout_heigth: Chiều dài của control (Tính theo trục Oy từ góc trên bên trái xuống dưới). Có 3 thuộc tính như layout:width o text: nội dung của Textview o texcolor: màu chữ (hệ màu 16) o background: màu nền cho textview (hệ màu 16) o id: Tương tự như thuộc tính name trong C#, đây sẽ là tên controls để gọi trong 83

84 o Gravity: căn chỉnh nội dung trong textview Giá trị : Center, left, right, bottom. o textstyle: style cho nội dung: Bold(đậm), Italic (nghiêng),. o textsize: kích thước của chữ o paddingleft(top-right-bottom): khoảng cách so với parent - Một số phương thức: o settext: gán nội dung cho TextView o gettext: lấy nội dung của TextView - Ví dụ: điều khiển TextView thiết kế trong tệp xml Layout 7.3. Nhóm điều khiển Button - Chức năng: Nhóm điều khiển Button bao gồm 2 điều khiển (Button, Small Button) có chức năng tương tự như Button trong C#, dùng làm nút nhấn để thực hiện các chức năng của ứng dụng. - Một số thuộc tính thường dùng: Các thuộc tính giống như điều khiển TextView. - Một số phương thức thường dùng: o settextcolor: thiết lập mầu chữ. o setbackgroundcolor: thiết lập mầu nền Button - Một số sự kiện thường dùng: o OnClick: xảy ra khi người dùng nhấn vào Buton. Việc viết sự kiện cho Button đã được giới thiệu ở bài trước - Bài tập: Trên thực tế Button của Android nhìn rất thô, vì vậy người dùng thường phải custom cho đẹp hơn. Sinh viên tự tìm hiểu cách custom button 84

85 7.4. Nhóm điều khiển TextFields - Chức năng: Bao gồm nhiều điều khiển khác nhau có chức năng nhập liệu giống như Textbox (sự khác nhau của những điều khiển này ở chỗ bàn phím hiện ra khi focus vào các text fields) - Một số thuộc tính thường dùng: Các thuộc tính cũng tương tự như Textview, chỉ có một số điểm khác biệt sau: o Hint: phần text gợi ý cho người dùng trước khi nhập liệu o inputtype: cho phép nhập một số dạng: Password, , Phone.(tương ứng với trong phần control kéo thả cũng có 1 số loại thường dùng được google để sẵn). 85

86 o textautocorrect : Tự động sửa đúng chính tả, giả sử bạn nhập teh thì nó sẽ tự động sửa thành the - Ví dụ: Tạo một ứng dụng bao gồm tất cả các điều khiển Text Fields sau đó chạy ứng dụng để thấy sự khác nhau khi Focus vào mỗi Text Fields 7.5. Điều khiển CheckBox - Chức năng: dùng cho việc xử lý đa lựa chọn. - Một số thuộc tính thường dùng: o Checked: true/false đặt trạng thái cho checkbox - Một số phương thức thường dùng: o setchecked: thiết lập trạng thái cho checkbox setchecked (true): check setchecked (false): bỏ check o ischecked: kiểm tra xem trạng thái được check hay không. Trả về một trong hai trạng thái True/False - Một số sự kiện thường dùng: o CheckedChanged: xảy ra khi người dùng check vào CheckBox viết sự kiện này theo ít nhất 2 cách (tương tự Button ở trên) 86

87 o Click: gần tương tự sự kiện CheckedChanged - Ví dụ minh họa: Thiết kế ứng dụng đặt xuất trong cửa hàng KFC có giao diện như sau: Khi người dùng nhấn nút Đặt hàng thì hiển thị số tiền mà người dùng phải trả. Hướng dẫn: Thiết kế giao diện và viết code như dưới: activity_main.xml <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/main"> <TableRow android:gravity="center" android:id="@+id/tablerow1" android:layout_height="wrap_content" > <TextView android:layout_gravity="center" android:id="@+id/textview1" android:layout_height="wrap_content" android:text="menu KFC" android:textalignment="center" android:textappearance="?android:attr/textappearancelarge" /> </TableRow> <TableRow android:id="@+id/tablerow2" android:layout_height="wrap_content" > <CheckBox 87

88 android:layout_height="wrap_content" android:text="cánh gà rán (VNĐ)" /> </TableRow> <TableRow android:id="@+id/a1" android:layout_height="wrap_content" > <CheckBox android:id="@+id/cbduigaran" android:layout_height="wrap_content" android:text="đùi gà rán (VNĐ)" /> </TableRow> <TableRow android:id="@+id/cbco1mbo" android:layout_height="wrap_content" > <CheckBox android:id="@+id/cbcombo" android:layout_height="wrap_content" android:text="combo (VNĐ)" /> </TableRow> <TableRow android:id="@+id/tablerow3" android:layout_height="wrap_content" > <CheckBox android:id="@+id/cbthucanphu" android:layout_height="wrap_content" android:text="thức ăn phụ (VNĐ)" /> </TableRow> <TableRow android:gravity="center" android:id="@+id/tablerow4" 88

89 android:layout_height="wrap_content" > <Button style="?android:attr/buttonstylesmall" android:layout_height="wrap_content" android:text="đặt hàng" android:onclick="tongtien" /> </TableRow> <TableRow android:gravity="center" android:layout_gravity="center" android:layout_height="wrap_content" > <TextView android:layout_gravity="center" android:layout_height="wrap_content" android:text="tổng tiền: " android:textappearance="?android:attr/textappearancelarge" /> </TableRow> </TableLayout> MainActivity package com.example.hoangquocviet.checkbox; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.checkbox; import android.widget.textview; public class MainActivity extends ActionBarActivity 89

90 protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //Phương thức tính tổng public void TongTien(View v) { int Tong = 0; //Khai báo điều khiển CheckBox cbcanh, cbdui, cbcom, cbkhac; TextView tv; // cbcanh = (CheckBox) findviewbyid(r.id.cbcanhgaran); cbdui = (CheckBox) findviewbyid(r.id.cbduigaran); cbcom = (CheckBox) findviewbyid(r.id.cbcombo); cbkhac = (CheckBox) findviewbyid(r.id.cbthucanphu); tv = (TextView) findviewbyid(r.id.tvtong); // if (cbcanh.ischecked()) { Tong = Tong ; if (cbdui.ischecked()) { Tong = Tong ; if (cbcom.ischecked()) { Tong = Tong ; if (cbkhac.ischecked()) { Tong = Tong ; // tv.settext(tong + ""); 7.6. Điều khiển RadioButton - Chức năng: dùng cho việc xử lý đơn lựa chọn. Android thường sử dụng loại điều khiến này để cho người dùng chọn một trong số các tùy chọn xác định nào đó. Điều khiển này phải sử dụng kết hợp với điều khiển RadioGroup. Nếu không sử dụng với điều khiển RadioGroup thì tại một thời điển chúng ta có thể lựa chọn tất cả các RadioButton (xem hình bên dưới): 90

91 - Một số thuộc tính thường dùng: o Checked: thuộc tính này nhận một trong hai giá trị true/false để đặt trạng thái cho điều khiển RadioButton. android:checked="true": Radio Button được chọn android:checked="false": Bỏ chọn Radion Button - Một số phương thức thường dùng: o setchecked: thiết lập trạng thái cho RadioButton setchecked (true): Radio Buton được check setchecked (false): Bỏ check điều khiển Radion Button o ischecked: kiểm tra xem trạng thái được check hay không. - Một số sự kiện thường dùng: o onclick: xảy ra khi click vào điều khiển RadioButton. - Ví dụ minh họa: Thiết kế một Layout có giao diện như sau: 91

92 Khi người dùng chọn một phương án trả lời nào thì hiển thị ra một thông báo bạn đã chọn phương án tương ứng: Hướng dẫn: english.xml <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView 92

93 android:layout_height="wrap_content" android:textappearance="?android:attr/textappearancelarge" android:text="present simple" android:layout_gravity="center_horizontal"/> <RadioGroup android:layout_height="wrap_content" > <RadioButton android:layout_height="wrap_content" android:text="i lives in Hung Yen" android:onclick="clickevent" /> <RadioButton android:layout_height="wrap_content" android:text="i living in Hung Yen" android:onclick="clickevent" /> <RadioButton android:layout_height="wrap_content" android:text="i lived in Hung Yen" android:onclick="clickevent" android:checked="false" /> <RadioButton android:layout_height="wrap_content" android:text="i live in Hung Yen" android:onclick="clickevent" /> </RadioGroup> </LinearLayout> MainActivity public class MainActivity extends ActionBarActivity 93

94 protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.english); public void ClickEvent(View v) { boolean b = ((RadioButton) v).ischecked(); // AlertDialog.Builder al=new AlertDialog.Builder(this); al.setmessage("radiobutton"); // switch (v.getid()) { case R.id.rbAnswerA: al.setmessage("you selected Answer A"); break; case R.id.rbAnswerB: al.setmessage("you selected Answer B"); break; case R.id.rbAnswerC: al.setmessage("you selected Answer C"); break; case R.id.rbAnswerD: al.setmessage("you selected Answer D"); break; al.create().show(); 94

95 7.7. Điều khiển Tab - Chức năng: giống điều khiển Tab Control trong C# cho phép ứng dụng Android làm việc trên nhiều tab khác nhau. - Một số khái niệm: o Tab=Tab Host = Tab Widgets + FrameLayout. Tab Host: Là Container chính chứa các Tab buttons và Tab contents Tab Widget: Để định dạng cho các Tab buttons : Nhãn, Icon (mỗi Tab trong TabWidget được gọi là TabSpec) FrameLayout: Là Container để chứa các layout cho Tab contents, ta chỉ có thể dùng FrameLayout cho Tab contents, không thể dùng các loại Layout khác - Ví dụ minh họa: Ví dụ minh họa: thiết kế trang đăng kí gồm 2 Tab có giao diện như bên dưới. Trong đó: o Tab 1: Form đăng kí tài khoản o Tab 2: Hiển thị các tài khoản đã được đăng kí (chỉ bao gồm ListView) 95

96 o Hướng dẫn: giải quyết yêu cầu trên theo 3 bước sau: Bước 1: Tạo ứng dụng Android Studio có cấu trúc như sau (3 layout và 1 Activity) Bước 2: Thiết kế các Layout có giao diện như sau main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TabHost 96

97 android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TabWidget android:layout_width="fill_parent" android:layout_height="wrap_content"></tabwidget> <FrameLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <include /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" ></LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <include /> </LinearLayout> </FrameLayout> </LinearLayout> </TabHost> </LinearLayout> 97

98 tab1.xml <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow android:gravity="center" android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="đăng NHẬP" android:textappearance="?android:attr/textappearancelarge" /> </TableRow> <TableRow android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="tên ĐN:" /> <EditText android:layout_height="wrap_content" android:ems="10" /> </TableRow> <TableRow android:layout_height="wrap_content" > 98

99 <TextView android:layout_height="wrap_content" android:text="mật khẩu:" /> <EditText android:layout_height="wrap_content" android:ems="10" > <requestfocus /> </EditText> </TableRow> <TableRow android:gravity="center" android:layout_height="wrap_content" > <Button android:onclick="login" android:layout_height="wrap_content" android:text="ok" /> </TableRow> </TableLayout> tab2.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> 99

100 - Bước 3: Viết code gọi trong Activity MainActivity package com.example.hoangquocviet.tabcontrol; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.menu; import android.view.menuitem; import android.widget.button; import android.widget.tabhost; public class MainActivity extends ActionBarActivity { TabHost tb; Button protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); // tb=(tabhost)findviewbyid(r.id.tabhost); tb.setup(); // TabHost.TabSpec tspec; tspec=tb.newtabspec("t1"); tspec.setcontent(r.id.tab1); tspec.setindicator("login"); tb.addtab(tspec); // tspec=tb.newtabspec("t2"); tspec.setcontent(r.id.tab2); tspec.setindicator("list"); tb.addtab(tspec); // tb.setcurrenttab(0); 100

101 BÀI 8: THẢO LUẬN/BÀI TẬP 02: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1) BÀI 9. CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) 9.1. Điều khiển TimePicker - Chức năng: điều khiển cho phép lựa chọn thời gian (giờ, phút). - Một số phương thức thường dùng: o getcurrenthour o getcurrentminute o setcurrenthour o setcurrentminute - Một số sự kiện thường dùng: o OnClick - Ví dụ minh họa: sinh viên tự viết Điều khiển TimePickerDialog - Chức năng: giống như điều khiển TimePicker nhưng điều khiển này chỉ được hiển thị khi được gọi đỡ tốn diện tích hơn so với điều khiển TimePicker Thường dùng điều khiển này hơn. - Một số sự kiện thường dùng: o OnTimeSet - Ví dụ minh họa: sinh viên tự viết. 101

102 9.3. Điều khiển DatePicker Gần giống với điều khiển TimerPicker, sinh viên tự nghiên cứu và tham khảo ví dụ giáo viên gửi Điều khiển DatePickerDialog Gần giống với điều khiển TimePickerDialog, sinh viên tự nghiên cứu và tham khảo ví dụ giáo viên gửi. Bài tập tổng hợp: Xây dựng ứng dụng quản lý công việc đơn giản: 102

103 BÀI 10: THỰC HÀNH 01: ỨNG DỤNG HELLO WORLD BÀI 11. SPINNER, LISTVIEW VÀ GRIDVIEW Điều khiển Spinner - Chức năng: tương tự combobox trong C#. Cho phép người dùng lựa chọn từ một danh sách có sẵn được hiển thị ra khi người dùng nhấn chọn vào Combobox. - Một số sự kiện thường dùng: o ItemSelected: khi người dùng nhấn chọn 1 phần tử trong Spinner. - Ví dụ minh họa: o Yêu cầu giao diện: Thiết kế một layout có giao diện như sau: o Yêu cầu chức năng: Khi người dùng nhấn chọn một phần tử trong Spinner thì hiện thị phần tử chọn xuống TextView bên dưới. o Hướng dẫn: spinner.xml Layout <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textview1" android:layout_gravity="center" android:layout_height="wrap_content" android:text="spinner" 103

104 android:textappearance="?android:attr/textappearancelarge" /> <Spinner android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#b4c3f2" /> <TextView android:layout_height="wrap_content" android:text="textview" /> </LinearLayout> MainActivity (file code) package com.example.hoangquocviet.spinner; import android.app.activity; import android.os.bundle; import android.view.view; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.spinner; import android.widget.textview; public class spinner1activity extends Activity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.spinner1); //Khai báo mảng dữ liệu làm nguồn cho Spinner final String arr[] = { "Đặng Vân Anh", "Nguyễn Văn Quyết", "Nguyễn Minh Tiến"; //Lấy đối tượng Spinner và TextView Spinner spin = (Spinner) findviewbyid(r.id.spdemo); final TextView selection=(textview) findviewbyid(r.id.textview2); //Gán Data source (arr) vào Adapter ArrayAdapter<String> adapter = new ArrayAdapter<String> ( this, android.r.layout.simple_spinner_item, arr ); //Hiển thị danh sách cho Spinner 104

105 adapter.setdropdownviewresource (android.r.layout.simple_list_item_single_choice); //Thiết lập adapter cho Spinner spin.setadapter(adapter); //Viết sự kiện cho Spinner (Inline anonymous listener) spin.setonitemselectedlistener(new AdapterView.OnItemSelectedListener() public void onitemselected(adapterview<?> parent, View view, int position, long id) { // TODO Auto-generated method stub selection.settext(arr[position]); public void onnothingselected(adapterview<?> parent) { Điều khiển ListView - Chức năng: Điều khiển ListView dùng hiển thị danh sách dữ liệu. - Một số sự kiện thường dùng: o ItemClick: xảy ra khi người dùng nhấn chọn 1 phần tử trong ListView. - Hiển thị dữ liệu vào ListView: Chúng ta có nhiều cách lấy dữ liệu đưa vào ListView: o Mảng dữ liệu (ví dụ: mảng String[] thông thường). o Dữ liệu được lưu trong tệp xml. o Lấy từ CSDL SQLite, tệp text. o - Chú ý: Cách hiển thị dữ liệu (các bước hiển thị dữ liệu) từ một nguồn dữ liệu (Mảng dữ liệu ) lên Spinner, ListView, GridView là hoàn toàn giống nhau. - Ví dụ minh họa 1: Thiết kế ứng dụng Android có giao diện như sau: 105

106 o Yêu cầu: Dữ liệu được lấy từ một mảng dữ liệu có sẵn. Khi người dùng nhấn vào một phần từ dưới ListView thì hiển thị chỉ số và giá trị của phần từ chọn lên TextView phía trên. o Hướng dẫn: các bạn có thể tham khảo code dưới đây: protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.giaodien); //1. Khởi tạo dữ liệu cho mảng arr (còn gọi là data source) final String arr[]={"nguyễn Văn Quyết","Lê Thị Thu Hương"; //final String arr[]=getresources().getstringarray(r.array.mang);//mảng lấy từ file xml //2. Lấy đối tượng Listview dựa vào id ListView lv=(listview) findviewbyid(r.id.lvdemo); final TextView tv=(textview)findviewbyid(r.id.tvtest); //3. Gán Data source vào ArrayAdapter ArrayAdapter<String>adapter=new ArrayAdapter<String> (this,android.r.layout.simple_list_item_1, arr); //4. Đưa Data source vào ListView lv.setadapter(adapter); //5. Sự kiện lv.setonitemclicklistener( new AdapterView.OnItemClickListener() { public void onitemclick(adapterview<?> arg0, View arg1,int arg2,long arg3) { //đối số arg2 là vị trí phần tử trong Data Source (arr) tv.settext("position :"+arg2+";value ="+arr[arg2]); ); 106

107 - Ví dụ minh họa 2: Thiết kế ứng dụng Android có giao diện như sau: o Yêu cầu: Lấy dữ liệu từ EditText đưa vào ListView Xóa dữ liệu từ ListView o Hướng dẫn: Các bạn tham khảo code dưới: MainActivity //KHAI BÁO CÁC BIÊN TOÀN CỤC (BÊN NGOÀI ON-CREATE) EditText txtten; Button btn; ListView lv; ArrayList<String>arrList=null; ArrayAdapter<String> adapter=null //VIẾT TRONG FORM_LOAD (ON CREATE) txtten=(edittext) findviewbyid(r.id.txthoten); lv=(listview) findviewbyid(r.id.listview1); //1. Tạo ArrayList object arrlist=new ArrayList<String>(); //2. Gán Data Source (ArrayList object) vào ArrayAdapter adapter=new ArrayAdapter<String> (this,android.r.layout.simple_list_item_1,arrlist); //3. gán Adapter vào ListView lv.setadapter(adapter); btn=(button) findviewbyid(r.id.btok); //4. Xử lý sự kiện nhấn nút Nhập btn.setonclicklistener(new View.OnClickListener() { public void onclick(view arg0) { arrlist.add(txtten.gettext()+""); adapter.notifydatasetchanged(); ); //5. Xử lý sự kiện chọn một phần tử trong ListView lv.setonitemclicklistener(new AdapterView.OnItemClickListener() { public void onitemclick( 107

108 AdapterView<?> arg0,view arg1, int arg2,long arg3) { ); Điều khiển GridView - Chức năng: hiển thị danh sách dữ liệu theo hàng và cột - Một số thuộc tính thường dùng: o android:numcolumns="3": hiển thị số cột trong GridView. - Một số sự kiện thường dùng: - Chú ý: o onitemclick: xảy ra khi người dùng nhấn chọn 1 phần tử trong GridView. o Việc lấy dữ liệu làm nguồn cho Spinner, ListView, GridView tương tự nhau. o Việc thêm, sửa, xóa dữ liệu trong Spinner, ListView, GridView tương tự nhau sử dụng ArrayList. - Ví dụ minh họa: hiển thị dữ liệu lên GridView MainActivity //Dùng mảng 1 chiều hoặc ArrayList để lưu một số dữ liệu final String arr[]={"dell","hp","mac","samsung","acer","asus"; //Tối tượng này dùng để hiển thị phần tử được chọn trong GridView final TextView selection=(textview)findviewbyid(r.id.tvdienthoai); final GridView gv=(gridview) findviewbyid(r.id.gridview1); //Gán DataSource vào ArrayAdapter ArrayAdapter<String>da=new ArrayAdapter<String> ( this,android.r.layout.simple_list_item_1, arr ); //gán Datasource vào GridView gv.setadapter(da); //Thiết lập sự kiện cho GridView, gv.setonitemclicklistener(new AdapterView.OnItemClickListener() { public void onitemclick(adapterview<?> arg0, View arg1, int arg2, long arg3) { //Hiển thị phần tử được chọn trong GridView lên TextView selection.settext(arr[arg2]); ); 108

109 BÀI 12: THỰC HÀNH 02: ANDROID LAYOUT BÀI 13: THẢO LUẬN/BÀI TẬP 03: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) BÀI 14: THỰC HÀNH 03: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (1) BÀI 15. LÀM VIỆC VỚI MENU Option menu Chức năng: Dùng thiết kế các tùy chọn cho một ứng dụng Android. Menu khá hữu ích trong lập trình Android Cách hiển thị Menu: Làm thế nào để hiển thị Menu trong Android? - Đối với máy ảo: bạn chỉ việc nhấn vào Nút Menu: - Đối với máy thật: Tùy theo dòng máy. Ví dụ với Samsung Galaxy S3 của mình bạn chỉ việc nhấn vào nút menu bên trái: 109

110 Ví dụ minh họa: - Yêu cầu: Thiết kế ứng dụng có giao diện đơn giản bên dưới: Khi người dùng nhấn vào Button Menu trên máy ảo (hoặc máy thật) sẽ hiển thị menu có 3 menu con (Đỏ, Vàng, Xanh), khi nhấn vào mỗi menu con hiển thị ra MessageBox tương ứng. - Chú ý: các giá trị menu trong Android được lưu trữ trong tệp xml. Được lưu trong thư mục menu của ứng dụng Android Studio. - Hướng dẫn thực hiện: 110

111 o Bước 1: Tạo dự án Android Studio có cấu trúc như sau: o Bước 2: Tạo menu. Tạo tệp xml trong thư mục và đặt tên là main.xml (như bên trên) theo các bước Nhấn chuột phải vào thư mục menu trong ứng dụng Android và chọn như hình bên dưới: 111

112 Nội dung tệp main.xml khi mới được tạo ra Tạo 3 mục menu (hay nhiều mục menu tùy theo ứng dụng của các bạn) bằng các thẻ item như bên dưới - Bước 3: Gọi các menu hiển thị: Tạo file xml menu như ở mục 2 là chưa đủ, nếu bây giờ chạy ứng dụng và nhấn mục menu trên máy ảo cũng không hiển thị các menu Đỏ, Vàng, Xanh như yêu cầu. Để gọi các menu chúng ta cần 112

113 viết phương thức oncreateoptionsmenu (phương thức này được mặc định tạo ra khi bạn tạo một Project Android) - Bước 4: Viết code việc xử lý khi nhấn vào mỗi menu (Nhấn vào Đỏ, Vàng, Xanh). Chúng ta chỉ cần viết trong phương thức onoptionsitemselected (phương thức này được mặc định tạo ra khi bạn tạo một Project Android) MainActivity package com.example.hoangquocviet.menu; import android.app.alertdialog; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.menu; import android.view.menuitem; public class MainActivity extends ActionBarActivity protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); public boolean oncreateoptionsmenu(menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.main, menu); return public boolean onoptionsitemselected(menuitem item) { AlertDialog.Builder al=new AlertDialog.Builder(this); al.settitle("menu"); switch(item.getitemid()) { 113

114 case R.id.itemDo: //Xử lý khi người dùng nhấn vào menu đỏ al.setmessage("bạn vừa chọn màu ĐỎ!"); break; case R.id.itemVang: //Xử lý khi người dùng nhấn vào menu đỏ al.setmessage("bạn vừa chọn màu VÀNG!"); break; case R.id.itemXanh: //Xử lý khi người dùng nhấn vào menu đỏ al.setmessage("bạn vừa chọn màu XANH!"); break; al.create().show(); return super.onoptionsitemselected(item); Context menu Chức năng: ContextMenu hay menu ngữ cảnh là menu được hiển thị ra khi ta nhấn và giữ vào một điều khiển (trong lập trình Windows thì để hiển thị ContextMenu chúng ta chỉ cần nhấn chuột phải vào một đối tượng nào đó) Ví dụ minh họa: - Yêu cầu: Thiết kế ứng dụng Android có giao diện như sau: Khi người dùng nhấn (và giữ) button CONTEXT MENU thì hiển thị Context Menu có giao diện như sau: 114

115 Khi người dùng nhấn vào Menu Xanh, Đỏ, Vàng thì thay đổi mầu chữ (TextColor) của Button CONTEXT MENU thành mầu tương ứng (Màu xanh, đỏ, vàng). - Hướng dẫn: o Bước 1: Tạo dự án Android Studio có cấu trúc như sau: 115

116 o Bước 2: Thiết kế giao diện cho ứng dụng (Layout activity_main.xml) activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:layout_gravity="center" android:layout_width="302dp" android:layout_height="wrap_content" android:text="context Menu" /> <TextView android:layout_gravity="center" android:gravity="center" android:layout_width="278dp" android:layout_height="wrap_content" android:text="hoàng QUỐC VIỆT" android:textappearance="?android:attr/textappearancelarge" /> </LinearLayout> o Bước 3: Thiết kế các mục menu (tương tự bước 2 ở mục option menu) menu\manu_main.xml <menu xmlns:android=" xmlns:app=" xmlns:tools=" tools:context=".mainactivity"> <item android:id="@+id/itemxanh" android:title="xanh"></item> <item android:id="@+id/itemdo" android:title="đỏ"></item> <item android:id="@+id/itemvang" android:title="vàng"></item> </menu> 116

117 o Bước 4: Định nghĩa giá trị màu (values\contextmenuvalues.xml). Để định nghĩa các giá trị màu trong Android chúng ta làm như sau: nhấn chuột phải vào thư mục values và chọn như hình bên dưới: Nội dung file contextmenuvalues.xml ban đầu: 117

118 dưới: Định nghĩa các màu bằng thẻ color trong tệp contextmenuvalues.xml như bên o Bước 5: Gọi các menu hiển thị: Tạo file xml menu như ở bước 3 là chưa đủ, nếu bây giờ chạy ứng dụng và nhấn và giữ button CONTEXT MENU thì cũng không hiển thị các menu Đỏ, Vàng, Xanh như yêu cầu. Để hiển thị được các menu chúng ta cần viết trong phương thức oncreatecontextmenu o Bước 6: Viết code việc xử lý khi nhấn vào mỗi menu (Nhấn vào Đỏ, Vàng, Xanh. Chúng ta chỉ cần viết trong phương thức oncontextitemselected. MainActivity package com.example.hoangquocviet.contextmenu; import android.support.v7.app.actionbaractivity; import android.os.bundle; import android.view.contextmenu; import android.view.menu; import android.view.menuitem; import android.view.view; import android.widget.button; import android.widget.textview; public class MainActivity extends ActionBarActivity { Button btncontext; TextView tvcontextdemo; 118

119 @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); // btncontext = (Button) findviewbyid(r.id.btcontextmenu); tvcontextdemo = (TextView) findviewbyid(r.id.tvcontext); // registerforcontextmenu(btncontext); registerforcontextmenu(tvcontextdemo); public void oncreatecontextmenu(contextmenu menu, View v, ContextMenu.ContextMenuInfo menuinfo) { //super.oncreatecontextmenu(menu, v, menuinfo); getmenuinflater().inflate(r.menu.menu_main, public boolean oncontextitemselected(menuitem item) { switch (item.getitemid()) { case R.id.itemDo: btncontext.settextcolor(getresources().getcolor(r.color.do)); break; case R.id.itemVang: btncontext.setbackgroundcolor(getresources().getcolor(r.color.vang)); break; case R.id.itemXanh: btncontext.settextcolor(getresources().getcolor(r.color.xanh)); break; return super.oncontextitemselected(item); 119

120 BÀI 16: THỰC HÀNH 04: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) BÀI 17: THẢO LUẬN/BÀI TẬP 04: CÁC ĐIỀU KHIỂN CƠ BẢN TRONG ANDROID (2) BÀI 18: THỰC HÀNH 05: SPINNER, LISTVIEW, GRIDVIEW BÀI 19. LẬP TRÌNH CSDL VỚI SQLITE (1) Giới thiệu SQLite SQLite là gì? Nói một cách đơn giản SQLite là phần mềm quản lý cơ sở dữ liệu (DBMS) tương tự như Mysql, PostgreSQL... Đặc điểm của SQLite là gọn, nhẹ, đơn giản. Chương trình gồm 1 file duy nhất vỏn vẹn chưa đến 500kB, không cần cài đặt, không cần cấu hình hay khởi động mà có thể sử dụng ngay. Dữ liệu database cũng được lưu ở một file duy nhất. Không có khái niệm user, password hay quyền hạn trong SQLite database. SQLite không thích hợp với những hệ thống lớn nhưng ở quy mô vừa tầm thì SQLite phát huy uy lực và không hề yếu kém về mặt chức năng hay tốc độ. Với các đặc điểm trên SQLite được sử dụng nhiều trong việc phát triển, thử nghiệm v..v.. và là sự lưa chọn phù hợp cho những người bắt đầu học database. Một vài nét chính: - Cơ sở dữ liệu dạng quan hệ (RDBMS), hỗ trợ chuẩn SQL-92 - Sử dụng dưới dạng thư viện nhúng, không chạy ở theo kiểu server độc lập - Hỗ trợ các ngôn ngữ phổ biến: C, C++, C#, Basic, Perl, Python, PHP, Java... - Không cần chỉ định kiểu dữ liệu (SQLite is typeless) - Hỗ trợ UTF8 - Hỗ trợ transaction - Hỗ trợ view - Có các công cụ quản lý bằng đồ hoạ (xem chi tiết ở dưới) - Download & sử dụng miễn phí Trang chủ SQLite: Có sử dụng được các câu lện SQL trong SQLite hay không? SQLite là một CSDL vì vậy có thể sử dụng tất cả các câu lệnh SQL để thao tác trên CSDL SQLite này: Select, insert, update, delete Có thể sử dụng C# để thao tác với CSDL SQLite hay không? 120

121 Trả lời: Chắc chắn là được rồi. SQLite là một CSDL (giống như CSDL Access trước đâu - chỉ bao gồm 1 file), vì vậy có thể sử dụng C# (Windows Form) để thao tác với CSDL này. Làm thế nào thì bạn cứ Google là ra thôi (học tin học phải quan liện Google là bạn thân nhất của bạn) Tạo cơ sở dữ liệu SQLite bằng cách nào? Có ít nhất 3 cách tạo CSDL SQLite. Mình giới thiệu từng cách theo mức độ thường xuyên sử dụng: - Cách 1: Sử dụng Add in của firefox (mình hay dùng cách này nhất) - Cách 2: Dùng công cụ SQLite Admin (phần mềm nhỏ) - Cách 3: Dùng câu lệnh SQL tạo CSDL Mình hướng dẫn cụ thể theo từng cách: - Cách 1: Sử dụng Add on của firefox (mình hay dùng cách này) sau: Các bạn có thể cài đặt Add on cho firefox để thao tác với SQLite theo các bước bên dưới. Vào Google và gõ add on sqlite (hay đại loại như vậy). Kết quả hiển thị ra như 121

122 Manager Sau khi cài xong, để sử dụng công cụ này chúng ta vào Tools SQLite Giao diện của công cụ SQLite Manager 122

123 Lưu CSDL SQLite trong ổ D. Sau khi nhấn Select Folder các bạn mở ổ D ra sẽ thấy CSDL có tên UTEHY.sqlite được lưu trong ổ D:\ 123

124 Đến đây thì chúng ta thiết kế các bảng CSDL như bình thường. - Cách 2: Dùng công cụ SQLite Admin Trước hết các bạn vào Google và gõ SQLite Admin, sau đó tải công cụ SQLite Administrator về máy. Đây là công cụ khá nhẹ (khoảng vài MB, chạy Portable không cần cài đặt). Giao diện của công cụ SQLite Administrator dùng để tạo CSDL: 124

125 Việc tạo và sử dụng công cụ này khá đơn giản. Các bạn sinh viên khoa CNTT UTEHY năm thứ 4 có thể tự tìm hiểu được. s3db CSDL được tạo ta bởi SQLite Administrator có đuôi mở rộng là.s2db hoặc - Cách 3: Dùng câu lệnh SQL Câu lệnh tạo bảng CSDL, Select, insert, update, delete...tương tự như các câu lệnh SQL thông thường mà các bạn đã được học trong môn SQL Server Câu lệnh tạo bảng CREATE TABLE [tbtaikhoan] ( [TenDangNhap] VARCHAR(20) NOT NULL PRIMARY KEY, [MatKhau] VARCHAR(20) NOT NULL, ) Cách tạo và lưu trữ CSDL SQLite trong một project Android Studio Một câu hỏi đặt ra với các bạn mới lập trình SQLite với Android là CSDL SQLite, hay cụ thể hơi nữa là file CSDL SQLite được để ở đâu trong project Android Studio để chúng ta có thể thao tác với CSDL này phục vụ cho bài toán của chúng ta? Chúng ta cần biết đường dẫn lưu CSDL SQLite để làm gì? 125

126 Để thao tác với bất kì CSDL nào chúng đều cần biết "địa chỉ" của CSDL để kết nối (nói chuyện) và thao tác, với SQL Server chúng ta cần biết địa chỉ (tên) Server...vì vậy với SQLite chúng ta cần phải biết file SQLite được lưu ở đâu để còn kết nối và thao tác. Tổng quát: dù chúng ta thao tác trên mý ảo hay máy thật thì CSDL SQLite luôn được lưu trên một đường dẫn tổng quát sau trên bộ nhớ: "/data/data/tên_package/databases/tên_database" Trong đó: - Tên_Database: Tên CSDL của bạn tạo ra - Tên_Package: tên package của ứng dụng của bạn, tên package được tạo ra khi bạn tạo ứng dụng Android. Ví dụ: Chúng ta đã biết CSDL được lưu ở đâu rồi, vậy trên thực tế trong một project Android Studio thì CSDL được lưu ở đâu và làm thế nào để lưu được CSDL vào đấy mà thao tác? Trên thực tế để thao tác với SQLite trong một project Android Studio người ta làm như sau: - Bước 1: Tạo CSDL SQLite và các bảng bằng 1 trong 3 cách ở trên. - Bước 2: Copy file CSDL SQLite vào thư mục assets trong project Android Stdudio (tài nguyên lưu trong thư mục assets của project Android studio là ReadOnly nên không thao tác thêm, sửa, xóa được). - Bước 3: Sử dụng code (viết phương thức) copy file SQLite trên vào đường dẫn 126

127 "/data/data/tên_package/databases/tên_database" và thao tác. Mình sẽ hưỡng dẫn chi tiết từng bước ở bên dưới thông qua ví dụ cụ thể Các bước làm việc với SQLite trong Android Để làm việc với CSDL SQLite nói riêng hay làm việc với các CSDL nói chung (SQL Server, Access, Oracle...) chúng ta phải trải qua 3 bước: - Bước 1: Mở kết nối đến Database. - Bước 2: Thao tác với CSDL đó: lấy về tổng số bản ghi, select, insert, update, delete - Bước 3: Đóng kết nối. 127

128 BÀI 20: THỰC HÀNH 06: LÀM VIỆC VỚI MENU VÀ CONTEXT MENU BÀI 21: THẢO LUẬN/BÀI TẬP 05: LẬP TRÌNH CSDL VỚI SQLITE BÀI 22: THỰC HÀNH 07: LẬP TRÌNH CSDL VỚI SQLITE BÀI 23. LẬP TRÌNH CSDL VỚI SQLITE (2) Các đối tượng làm việc với CSDL SQLite - Thư viện làm việc với CSDL SQLite trong Android: android.database.sqlite.sqlitedatabase - Các đối tượng thao tác với CSDL SQLite trong Android: trong Android để thao tác với CSDL SQLite (Tạo CSDL, mở kết nối đến CSDL, thao tác với CSDL, đóng kết nối ) chúng ta chỉ cần sử dụng đối tượng SQLiteDatabase là đủ. Một số phương thức của đói tượng này: o execsql: thực thi câu lệnh SQL. o rawquery: trả về đối tượng Cursor cho phép đọc database (tương tự đối tượng sqldatareader trong C#) Thao tác với CSDL SQLite Mình minh họa bài phần lập trình CSDL bằng bài toán cụ thể sau: Bài toán QUẢN LÝ TÀI KHOẢN: - Yêu cầu CSDL: tạo CSDL UTEHY.sqlite bao gồm 1 bảng tbtaikhoan (TenDN, MatKhau), sau đó nhập 2 bản ghi đại diện - Yêu cầu giao diện: Thiết kế ứng dụng Android có giao diện như sau: 128

129 - Yêu cầu chức năng: o Khi ứng dụng được chạy thì hiển thị các bản ghi trong CSDL lên ListView. o Khi người dùng nhấn một bản ghi dưới ListView thì hiển thị thông tin tương tứng vào 2 EditText tương ứng ở trên: Tên đăng nhập và mạt khẩu. o Khi người dùng nhấn button: THÊM, SỬA, XÓA thì thực hiện các chức năng tương ứng. Hướng dẫn thực hiện: bài toán giải quyết qua 5 bước sau: - Bước 1: Tạo CSDL và tạo bảng Việc tạo CSDL và tạo bảng khá đơn giản bằng công cụ Add on trên firefox, mình cũng đã hướng dẫn rồi. Tạo CSDL UTEHY.sqlite và lưu vào trong ổ D:\. Sau đó tạo bảng tbtaikhoan (TenDN, MatKhau) 129

130 130

131 131

132 - Bước 2: Tạo project DatabaseDemo và thiết kế giao diện. Tạo project Android Studio và đặt tên là DatabaseDemo, cấu trúc project khi mới được tạo ra (chú ý: project mới tạo ra chưa có thư mục assets để lưu SQLite). Thiết kế ứng dụng có cấu trúc như sau: Thiết kế Layout account.xml. Cấu trúc account.xml: 132

133 account.xml <TableLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent" android:stretchcolumns="*" > <TextView android:layout_height="wrap_content" android:gravity="center" android:text="quản LÝ TÀI KHOẢN" android:textappearance="?android:attr/textappearancelarge" /> <TableRow android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="tên đăng nhập: " /> <EditText android:layout_height="wrap_content" android:ems="10" > <requestfocus /> </EditText> </TableRow> <TableRow android:layout_height="wrap_content" > <TextView android:layout_height="wrap_content" android:text="mật khẩu: " /> <EditText 133

134 android:layout_height="wrap_content" android:inputtype="textpassword" android:ems="10" android:layout_column="1" /> </TableRow> <LinearLayout android:layout_height="wrap_content" android:orientation="vertical" > <TableRow android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" > <Button android:layout_height="wrap_content" android:onclick="insertdb" android:text="thêm" /> <Button android:layout_height="wrap_content" android:onclick="updatedb" android:text="sửa" /> <Button android:layout_height="wrap_content" android:onclick="deletedb" android:text="xóa" /> </TableRow> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> </TableLayout> 134

135 - Bước 3: Copy CSDL SQLite vào thư mục assets trong project Thư mục assets không có sẵn khi project được tạo ra. Để thêm thư mục này chúng ta làm như sau: Để copy CSDL UTEHY.sqlite vào thư mục assests bạn chỉ việc file UTEHY.sqlite và nhấn Copy (Ctrl + C) sau đó nhấn chọn thư mục assets và nhấn Ctrl+V là xong: 135

136 - Bước 4: Viết lớp chuyên thao tác với CSDL (mình đặt tên lớp là DatabaseHandler) các bạn chú ý các phương thức viết trong lớp này. Sau bước 3 bạn có CSDL UTEHY.sqlite trong thư mục assets, bây giờ việc của chúng ta là thao tác với CSDL này. Để thao tác với CSDL người ta viết ra một lớp chuyên thao tác với CSDL này (lớp này mình đặt là DatabaseHandler) Để thêm lớp DatabaseHandler vào project chúng ta làm như sau: Nhấn chuột phải vào package của project chọn New chọn Java Class như hình vẽ: 136

137 DatabaseHandler package com.example.hoangquocviet.databasedemo; import android.app.alertdialog; import android.content.context; import android.database.cursor; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqliteopenhelper; import android.widget.toast; import java.io.fileoutputstream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.util.arraylist; /** * Created by Hoang Quoc Viet on */ public class DatabaseHandler extends SQLiteOpenHelper { 137

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE:

HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE: HƯỚNG DẪN SỬ DỤNG HỆ THỐNG CẬP NHẬT CHỨNG THƯ SỐ HOTLINE: 19006276 Ngày phát hành : 03/08/2017 Nơi phát hành : Công ty CP Chữ ký số Vi Na Phiên bản : 2.0 1 Mục lục 1 Các thuật ngữ viết tắt... 3 2 Môi trường

More information

HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA

HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA HƯỚNG DẪN CÀI ĐẶT PHẦN MỀM DIỆT VIRUS AVIRA A V I R A A N T O À N H Ơ N Trang 1 Mục lục 1. Trước khi cài đặt... 3 1.1 Kiểm tra khả năng đáp ứng của hệ thống:... 3 1.2 Hướng dẫn nâng cấp:... 3 1.3 Hướng

More information

HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER

HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER HƯỚNG DẪN CÁCH SỬ DỤNG WINDOWS MOVIE MAKER Tiện ích của phần mềm Windows Movie Maker: Tạo Slide show trình chiếu ảnh. Tăng giảm độ sáng tối cho ảnh. Hiệu ứng chuyển ảnh. Chèn âm thanh và chỉnh sửa. Chèn

More information

Tình huống 1: PPPoE với Username và Password

Tình huống 1: PPPoE với Username và Password HƯỚNG DẪN CẤU HÌNH NHANH INTERNET (Vigor2912 / Vigor2925) Tình huống 1: PPPoE với Username và Password - CTY có một đường truyền cáp quang. - Nhà mạng đã cho mượn Converter quang và router - Router đó

More information

Internet Protocol. Bởi: Phạm Nguyễn Bảo Nguyên

Internet Protocol. Bởi: Phạm Nguyễn Bảo Nguyên Internet Protocol Bởi: Phạm Nguyễn Bảo Nguyên Chúng ta đã biết cách tạo User Profile và check mail từ Exchange Server với tùy chọn này nghĩa là bạn đang check mail bằng giao thức MAPI mà chỉ có khi cài

More information

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009 Hướng Dẫn Thực Hành Lập Trình Windows Khối: Cao Đẳng nghề và Trung Cấp Năm 2009 Hướng dẫn: Bài tập thực hành được chia làm nhiều Module Mỗi Module được thiết kế cho thời lượng là 3 tiết thực hành tại lớp

More information

TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO

TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO TÀI LIỆU THỰC HÀNH MÔN CƠ SỞ DỮ LIỆU NÂNG CAO Mục lục Index...2 Tài liệu tham khảo...2 Công cụ...2 Nội dung...2 Cú pháp tạo index...2 Cú pháp chỉnh sửa index...2 Áp đặt tính duy nhất trên cột không khóa...3

More information

Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng.

Cụ thể những công việc mà AndroidManifest.xml thực hiện: - Đặt tên cho Java package của ứng dụng. Trong bài 1 mình đã giới thiệu sơ lược về các thành phần cơ bản của Android cũng như việc sử dụng XML để lập trình ứng dụng Android. Trong bài này mình sẽ giới thiệu thêm về Android Manifest và đi sâu

More information

Tạo Project với MPLAB

Tạo Project với MPLAB [Pick the date] Tạo project với MPLAB, trình biên dịch CCS, program và debug với PICKit2 1. Cài đặt phần mềm MPLAB IDE v8.92 2. Cài đặt phần mềm CCS PIC C Compiler 3. Tạo project trên MPLAB với trình biên

More information

Cài đặt và cấu hình StarWind iscsi trên Windows. iscsi SAN là gì?

Cài đặt và cấu hình StarWind iscsi trên Windows. iscsi SAN là gì? iscsi SAN là gì? iscsi là Internet SCSI ( Small Computer System Interface ) là một chuẩn công nghiệp phát triển để cho phép truyền tải các lệnh SCSI qua mạng IP hiện có bằng cách sử dụng giao thức TCP/IP.

More information

Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ

Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ Giáo trình này được biên dịch theo sách hướng dẫn của Sun Light. Vì là hướng dẫn kỹ thuật, trong này những thuật ngữ kỹ thuật bằng tiếng Anh tôi chỉ dịch một lần cho các bạn hiểu nghĩa. Những từ đó, về

More information

Nội dung chính của chương. Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào?

Nội dung chính của chương. Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào? Chương 6 Đĩa cứng Nội dung chính của chương Các công nghệ đĩa cứng Cấu tạo vật lý của đĩa cứng Cấu tạo logic của đĩa cứng Cài đặt đĩa cứng như thế nào? Công nghệ đĩa cứng Đĩa cứng đọc/ghi dữ liệu như thế

More information

Bộ môn MMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Bộ môn MMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ Giới thiệu Lập trình mạng Truyền thông Cơ chế giao tiếp liên quá trình (IPC) Mô hình OSI Mạng TCP/IP Dịch vụ mạng Mô hình Client/Server Các kiểu kiến trúc chương trình 1 Truyền thông Là sự giao tiếp, trao

More information

BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì?

BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì? BÀI 1: VBA LÀ GÌ? TẠO MACRO, ỨNG DỤNG CÁC HÀM TỰ TẠO (UDF), CÀI ĐẶT ADD-INS VBA là gì? Nguyễn Duy Tuân: 0904.210.337 1/12 Macro là gì? Macro là một lệnh lệnh thực thi một hay nhiều thao tác người dùng

More information

HƯỚNG DẪN SỬ DỤNG PLESK PANEL

HƯỚNG DẪN SỬ DỤNG PLESK PANEL HƯỚNG DẪN SỬ DỤNG PLESK PANEL Trang 1 I. HƯỚNG DẪN ĐĂNG NHẬP 1. Đăng nhập hệ thống Plesk: Để đăng nhập vào hệt thống plesk panel thực hiện các bước sau(hình 1): - Trên trình duyệt web gõ vào địa chỉ: https://ip:8443

More information

Tài liệu hướng dẫn: Stored Procedure

Tài liệu hướng dẫn: Stored Procedure 1 Tài liệu hướng dẫn: Stored Procedure Tài liệu hướng dẫn: Stored Procedure Người thực hiện Hoàng Anh Tú Nội dung 1 Giới thiệu... 2 2 Stored Procedure cơ bản... 2 2.1 Tạo Stored Procedure... 3 2.1.1 Tạo

More information

Chương 5. Network Layer. Phần 1 - Địa chỉ IPv4. Tài liệu : Forouzan, Data Communication and Networking

Chương 5. Network Layer. Phần 1 - Địa chỉ IPv4. Tài liệu : Forouzan, Data Communication and Networking Chương 5 Network Layer Phần 1 - Địa chỉ IPv4 Tài liệu : Forouzan, Data Communication and Networking 1 Nội dung Địa chỉ IPv4 Internetworking Giao thức Internet (IP) Địa chỉ IPv6 2 Chức năng tầng Network

More information

Chương 6. Transport Layer. Tài liệu : Forouzan, Data Communication and Networking

Chương 6. Transport Layer. Tài liệu : Forouzan, Data Communication and Networking Chương 6 Transport Layer Tài liệu : Forouzan, Data Communication and Networking 1 Transport Layer Nội dung Đặc trưng của tầng transport Port number Multiplexing và Demultiplexing Connectionless Service

More information

Tạo repository mới. The working tree. The staging index. Lệnh git init tạo một repository loại git. tại thư mục hiện tại: $ git init

Tạo repository mới. The working tree. The staging index. Lệnh git init tạo một repository loại git. tại thư mục hiện tại: $ git init Tạo repository mới Lệnh git init tạo một repository loại git tại thư mục hiện tại: $ git init Khác với các hệ quản lý phiên bản khác, git cho phép đặt repo hoàn toàn tại máy tính local. Nội dung của toàn

More information

Bộ môn HTMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ

Bộ môn HTMT&TT, Khoa Công Nghệ Thông Tin và TT, ĐH Cần Thơ RPC và RMI Khái niệm RPC Khái niệm RMI Các bước cài đặt RMI trong Java Ví dụ về RMI 1 RPC (Remote Procedure Call) Khái niệm RPC: gọi thủ tục ở xa. Trong suốt về mặt ngữ nghĩa: gọi thủ tục ở xa cũng có

More information

BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C#

BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C# BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM TP.HCM KHOA CÔNG NGHỆ THÔNG TIN http://www.hcmup.edu.vn BÀI TẬP THỰC HÀNH LẬP TRÌNH WINDOWS C# Phần 1: Làm quen với ứng dụng Form 1. Bài tập mở đầu 1.1. Khởi

More information

Online Appointment System will work better with below conditions/ Hệ thống đặt hẹn online sẽ hoạt động tốt hơn với điều kiện sau đây:

Online Appointment System will work better with below conditions/ Hệ thống đặt hẹn online sẽ hoạt động tốt hơn với điều kiện sau đây: Online Appointment Link/ Link đặt hẹn online: http://www.vfsglobal.com/netherlands/vietnam/schedule-an- Appointment.html ( Using for applicants who wish to apply for The Netherlands visas at VFS Netherlands

More information

Chương 5. Network Layer 19/09/2016 1

Chương 5. Network Layer 19/09/2016 1 Chương 5 Network Layer 19/09/2016 1 Nội dung Địa chỉ IPv4 Địa chỉ IPv6 Internetworking Giao thức Internet (IP) Chuyển đổi từ IPv4 sang IPv6 19/09/2016 2 Địa chỉ IPv4 Là địa chỉ 32 bit duy nhất, nhận diện

More information

BELGIUM ONLINE APPOINTMENT

BELGIUM ONLINE APPOINTMENT BELGIUM ONLINE APPOINTMENT Online Appointment Link/ Link đặt hẹn online: http://www.vfsglobal.com/belgium/vietnam/vietnamese/schedule-anappointment.html Using for applicants who wish to apply for Belgium

More information

Bài Thực hành Asp.Net - Buổi 1 - Trang: 1

Bài Thực hành Asp.Net - Buổi 1 - Trang: 1 Bài 1.1 1. Khởi động VS2010 2. File > News > Web Site, chọn: Visual C# ASP.NET Empty Web Site Chọn vị trí lưu và đặt tên file là Bai1.1 3. Thêm trang mới (Web Form ; tên là Default.aspx) 4. Viết code như

More information

CẤU TRÚC DỮ LIỆU NÂNG CAO

CẤU TRÚC DỮ LIỆU NÂNG CAO CẤU TRÚC DỮ LIỆU NÂNG CAO Các kiến thức yêu cầu Tóm tắt nội dung môn học Phương pháp kiểm tra đánh giá Tài liệu tham khảo 1 Các kiến thức yêu cầu Các thuật toán và cấu trúc dữ liệu cơ bản Ngôn ngữ lập

More information

CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE)

CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE) CHƯƠNG 2: CÁC ĐẶC ĐIỂM VỀ MÔI TRƯỜNG PHÁT TRIỂN (IDE) Phan Trọng Tiến BM Công nghệ phần mềm Khoa Công nghệ thông tin, VNUA Email: phantien84@gmail.com Website: http://timoday.edu.vn Ch2- Cac dac diem moi

More information

GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM)

GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM) Chương 8 GIẢI THUẬT ĐỊNH TUYẾN (ROUTING ALGORITHM) Giải thuật định tuến 4- NỘI DUNG Tổng quan Link state Distance Vector Hierarchical routing Giải thuật định tuến 4- Tổng quan: Phối hợp giữa routing và

More information

ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO

ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO TRUNG TÂM TIN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP.HCM ĐỌC, GHI XML VỚI C# TRONG ADO.NET --- SỬ DỤNG VISUAL STUDIO 2010 --- 1 TRUNG TÂM TIN HỌC ĐẠI HỌC KHOA HỌC TỰ NHIÊN-TP.HCM Nội dung 1. Tổng quan về v XML

More information

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS (4CH - 8CH - 16CH)

HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS (4CH - 8CH - 16CH) HƯỚNG DẪN SỬ DỤNG ĐẦU GHI H.264 DVR VISION VS 401-801-1601 (4CH - 8CH - 16CH) Xin vui lòng đọc kỹ hướng dẫn trước khi sử dụng: + Format ổ cứng, nhấn phải chuột chọn Main Menu. + Nhấn Utility. 1 + Nhấn

More information

Mạng máy tính - Computer Network: Hệ. Giao thức - Protocol:

Mạng máy tính - Computer Network: Hệ. Giao thức - Protocol: CÔNG NGHỆ WEB VÀ ỨNG DỤNG Giới i thiệu chung Nội dung Nhắc lại một số khái niệm Phân loại trang web Một số bước chính trong phát triển website Công bố website trên internet Xác định cấu trúc website 3

More information

SIMULATE AND CONTROL ROBOT

SIMULATE AND CONTROL ROBOT SIMULATE AND CONTROL ROBOT CÁC BƯỚC THỰC HIỆN MÔ PHỎNG ĐIỀU KHIỂN ROBOT: Vẽ lại mô hình robot trong PRO_E 4.0. Liên kết mô hình với phần MATHLAB 2008. Xây dựng giao diện MATHLAB để điều khiển các mô hình.

More information

Google Search Engine. 12/24/2014 Google Search Engine 1

Google Search Engine. 12/24/2014 Google Search Engine 1 Google Search Engine 12/24/2014 Google Search Engine 1 Cách sử dụng Google Để sử dụng Google, máy tính của bạn chỉ cần có một trình duyệt web như Internet Explorer, Firefox, Netscape, NetCaptor và kết

More information

Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính

Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính dce Khoa KH & KTMT Bộ môn Kỹ Thuật Máy Tính, CE Department dce Tài liệu tham khảo Digital Systems, Principles and Applications, 8 th /5 th Edition, R.J. Tocci, Prentice Hall Digital Logic Design Principles,

More information

TỔNG QUAN VỀ.NET VÀ C#

TỔNG QUAN VỀ.NET VÀ C# TỔNG QUAN VỀ.NET VÀ C# PHAN TRỌNG TIẾN BM Công nghệ phần mềm Khoa Công nghệ thông tin, VNUA Email: phantien84@gmail.com Website: http://timoday.edu.vn 7/5/16 Tổng quan về.net và C# 1 Giới thiệu q.net là

More information

Bài tập lớn số 1. Giả lập bộ định thời

Bài tập lớn số 1. Giả lập bộ định thời Ghi chú: Bài tập lớn số 1 Giả lập bộ định thời Sinh viên nộp bài tại trang web: www.cse.hcmut.edu.vn/portal File nộp bài đặt tên là: ass1.tar.bz2 Hạn chót nộp bài: 08:00am 10/08/2010 SV có thể chỉnh sửa

More information

Chương 7. Application Layer. Tài liệu : Forouzan, Data Communication and Networking

Chương 7. Application Layer. Tài liệu : Forouzan, Data Communication and Networking Chương 7 Application Layer Tài liệu : Forouzan, Data Communication and Networking 1 Các ứng dụng mạng Network Applications Là những chương trình chạy trên những đầu cuối khác nhau, giao tiếp với nhau thông

More information

Dọn "rác" Windows 7 vào dịp cuối năm

Dọn rác Windows 7 vào dịp cuối năm Dọn "rác" Windows 7 vào dịp cuối năm Windows 7 được xem là hệ điều hành hiện đại nhất, giao diện bóng bẩy nhưng cũng là hệ điều hành chiếm nhiều tài nguyên hệ thống. Làm thế nào để Windows 7 có thể chạy

More information

STACK và QUEUE. Lấy STACK

STACK và QUEUE. Lấy STACK MỤC TIÊU STACK và QUEUE Hoàn tất phần thực hành này, sinh viên có thể: - Hiểu được cách thức sử dụng stack và queue trên cơ sở sử dụng danh sách liên kết để cài đặt. - Hiểu và vận dụng các cấu trúc stack

More information

Hướng dẫn cài đặt FPT

Hướng dẫn cài đặt  FPT Hướng dẫn cài đặt Email FPT ---X--- Cài đặt email @FPT.VN bằng phần mềm Thunder Bird Bước 1: Mở Thunder Bird, chọn Tools >> Account Setting Bước 2: Tại Account Setting, chọn Account Actions >> Add Mail

More information

Nhấn nút New để tạo 1 biến mới Trang 17

Nhấn nút New để tạo 1 biến mới Trang 17 Thiết lập biến môi trường để chạy java ở cơ chế command-line Mở System Properties, Chọn thẻ Advanced Nhấn nút Environment Variables Nhấn nút New để tạo 1 biến mới Đường dẫn đến thư mục cài đặt JDK Nhấn

More information

BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3

BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3 BÀI 6 LÀM VIỆC VỚI THÀNH PHẦN MỞ RỘNG CỦA CSS3 NHẮC LẠI BÀI TRƯỚC Làm việc với các thuộc tính mới trong CSS3: Border-radius Border-image Gradient Transform, transition, animation Làm việc với font web

More information

Kỹ thuật thu nhỏ đối tượng trong Design (Layout)

Kỹ thuật thu nhỏ đối tượng trong Design (Layout) Kỹ thuật thu nhỏ đối tượng trong Design (Layout) Viết bởi : Steve Smith http://smith9x.wordpress.com - Kỹ thuật này do mình tự nghĩ ra, đơn giản hóa cụ thể như sau : + Ta sẽ thiết kế các đối tượng lớn

More information

B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam;

B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam; B5: Time to coding. Tới thư mục src/example.java và thay đổi nội dung file như sau: Mã: package at.exam; import java.util.arraylist; import android.app.activity; import android.app.alertdialog; import

More information

LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách)

LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách) Lab 04: LẬP TRÌNH WINDOWS FORM VỚI CÁC CONTROL NÂNG CAO (Các control trình bày dữ liệu dưới dạng danh sách) A. MỤC TIÊU: Sử dụng Visual Studio.NET 2010/2012/2013 tạo ứng dụng dạng Windows Forms với các

More information

HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT

HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT HƢỚNG DẪN TRIỂN KHAI KASPERSKY - MOBILE DEVICE MANAGEMENT 2015 THÔNG TIN KIỂM SOÁT Đơn vị chịu trách nhiệm CÔNG TY CỔ PHẦN TÍCH HỢP HỆ THỐNG NAM TRƢỜNG SƠN. Số 20 Tăng Bạt Hổ, Phường 11, Quận Bình Thạnh.TPHCM

More information

Ôn tập Thiết bị mạng và truyền thông DH07TT - Lưu hành nội bộ (không sao chép dưới mọi hình thức)

Ôn tập Thiết bị mạng và truyền thông DH07TT - Lưu hành nội bộ (không sao chép dưới mọi hình thức) 1 Câu 1: Tầng Internet có những giao thức nào? A. ICMP (Internet Control Message Protocol) B. IP (Internet Protocol) C. IGMP (Internet Group Messages Protocol) D. Cả 3 giao thức trên Tầng Liên Mạng (Internet

More information

MỤC LỤC. Giáo trình Thiết kế web Trang 1

MỤC LỤC. Giáo trình Thiết kế web Trang 1 NỘI DUNG MỤC LỤC TRANG LỜI NÓI ĐẦU... 3 TÀI LIỆU THAM KHẢO... 4 BÀI 1: GIỚI THIỆU TỔNG QUAN VỀ DREAMWEAVER... 5 I. GIỚI THIỆU... 5 II. CÁC THAO TÁC CĂN BẢN TRONG DREAMWEAVER... 5 III. ĐỊNH DẠNG GIAO DIỆN

More information

1 Bước 1: Test thử kit LaunchPad.

1 Bước 1: Test thử kit LaunchPad. KHOA ĐIỆN ĐIỆN TỬ CLB NGHIÊN CỨU KHOA HỌC Tp. Hồ Chí Minh, ngày 07 tháng 04 năm 2013 HƯỚNG DẪN NẠP BOARD MAIN-MSP430 BẰNG KIT LAUNCHPAD Tài liệu này hướng dẫn cách sử dụng Kit TI MSP430 Launch Pad như

More information

dụng một chính sách, điều này giúp dễ dàng quản lý và cung cấp tính năng Load Balancing (cân bằng tải) phục vụ tốt hơn các yêu cầu của tổ chức.

dụng một chính sách, điều này giúp dễ dàng quản lý và cung cấp tính năng Load Balancing (cân bằng tải) phục vụ tốt hơn các yêu cầu của tổ chức. ISA SERVER FIREWALL Trong số những sản phẩm tường lữa trên thị trường hiện nay thì ISA Server 2004/2006 của Microsoft là firewall được nhiều người yêu thích nhất do khả năng bảo vệ hệ thống mạnh mẽ cùng

More information

Bài 10. Cấu trúc liên nối. khác nhau được gọi là cấu trúc liên nối. nhu cầu trao đổi giữa các module.

Bài 10. Cấu trúc liên nối. khác nhau được gọi là cấu trúc liên nối. nhu cầu trao đổi giữa các module. Bài 10 HỆ THỐNG BUS 1 Cấu trúc liên nối Tập hợp các đường dẫn kết nối các module khác nhau được gọi là cấu trúc liên nối. Việc thiết kế cấu trúc này phụ thuộc vào nhu cầu trao đổi giữa các module. 2 1

More information

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN 07/2016 MỤC LỤC I. GIỚI THIỆU VỀ DỊCH VỤ CDN II. ĐĂNG KÝ TÀI KHOẢN VÀ TẠO DỊCH VỤ CDN 1. Đăng ký Tài khoản mới 2. Tạo gói Dịch vụ mới III. IV. THIẾT LẬP DỊCH VỤ HTTP/HTTPS

More information

Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY

Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY Phần 2. SỬ DỤNG POWERPOINT ĐỂ CHUẨN BỊ NỘI DUNG TRÌNH BÀY NỘI DUNG (1) 1. Giới thiệu PowerPoint và ứng dụng trong dạy học Mục đích sử dụng Các tính năng chung Một số kỹ năng thuyết trình sử dụng PP 2.

More information

I. Hướng Dẫn Đăng Nhập:

I. Hướng Dẫn Đăng Nhập: I. Hướng Dẫn Đăng Nhập: 1. Đăng nhập hệ thống Plesk: Để đăng nhập hệ thống thực hiện các bước sau: Bước 1: Trên trình duyệt web gõ địa chỉ http://hosting04.viettelidc.com.vn hoặc địa chỉ https://sww01.viettelidc.com.vn:8443

More information

GV: Phạm Đình Sắc or

GV: Phạm Đình Sắc   or Giới Thiệu: Lập trình ứng dụng Windows Form in VB.Net 2005 Thời lượng: 45 tiết LT 30 tiết TH GV: Phạm Đình Sắc Email: sacvn@yahoo.com or dinhsac@gmail.com Windows Form programming with VB.Net 2005. 1 Buổi

More information

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN

HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN HƯỚNG DẪN SỬ DỤNG DỊCH VỤ CDN 08/2016 MỤC LỤC I. GIỚI THIỆU VỀ DỊCH VỤ CDN II. ĐĂNG KÝ TÀI KHOẢN VÀ TẠO DỊCH VỤ CDN 1. Đăng ký Tài khoản mới 2. Mua mã nạp tiền 3. Tạo gói Dịch vụ mới III. IV. THIẾT LẬP

More information

Entity Framework (EF)

Entity Framework (EF) Entity Framework (EF) Lịch sử ra đời Các khái niệm cơ bản Kiến trúc EF DB First/Model First Code First/Code Second Kế thừa Eager/Lazy & Explicit Loading Performance/Profiling Tạ Hoàng Thắng 1 Model First

More information

BÀI GIẢNG CHƯƠNG 3 GIAO TIẾP KẾT NỐI SỐ LIỆU

BÀI GIẢNG CHƯƠNG 3 GIAO TIẾP KẾT NỐI SỐ LIỆU BỘ CÔNG THƯƠNG TRƯỜNG CAO ĐẲNG KỸ THUẬT CAO THẮNG KHOA ĐIỆN TỬ - TIN HỌC BÀI GIẢNG CHƯƠNG 3 GIAO TIẾP KẾT NỐI SỐ LIỆU Môn Học TRUYỀN SỐ LIỆU NỘI DUNG 3.1 Các khái niệm cơ bản về truyền số liệu 3.2 Thông

More information

Tìm hiểu Group Policy Object và các ví dụ

Tìm hiểu Group Policy Object và các ví dụ Tìm hiểu Group Policy Object và các ví dụ Các thành phần trong Group Policy Object Phần I: Computer Configuration: Windows Setting: Tại đây có thể tinh chỉnh, áp dụng các chính sách về vấn đề sử dụng tài

More information

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG HOSTING PLESK PANEL

TÀI LIỆU HƯỚNG DẪN SỬ DỤNG HOSTING PLESK PANEL Fall 08 CÔNGTYCỔPHẦNVIỄNTHÔNGFPT CÔNGTYTNHHMTVVIỄNTHÔNGQUỐCTẾFPT TÀILIỆUHƯỚNGDẪNSỬDỤNG HOSTING PLESKPANEL C T Y T N H H M T V F T I / F P T T E L E C O M MỤC LỤC I. HƯỚNG DẪN ĐĂNG NHẬP...2 1. Đăng nhập

More information

Lecture 12. Trees (1/2) Nội dung bài học:

Lecture 12. Trees (1/2) Nội dung bài học: Lecture 12. Trees (1/2) Nội dung bài học: 12.1. Khái niệm về cây. 12.2. Các phương pháp duyệt cây. Tham khảo: 1. Deshpande Kakde: C and Data structures.chm, Chapter 21: Trees 2. Elliz Horowitz Fundamentals

More information

HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG

HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG HỢP ĐỒNG MUA BÁN HÀNG HÓA QUỐC TẾ GV: NGUYỄN THỊ BÍCH PHƯỢNG KHÁI NIỆM & PHÂN LOẠI Hợp đồng mua bán hàng hóa quốc tế: còn được gọi là hợp đồng xuất nhập khẩu, hoặc hợp đồng mua bán ngoại thương là sự thỏa

More information

HƯỚNG DẪN QUẢN TRỊ HỆ THỐNG

HƯỚNG DẪN QUẢN TRỊ HỆ THỐNG Lab 07: HƯỚNG DẪN QUẢN TRỊ HỆ THỐNG MỤC TIÊU: Hướng dẫn gười dùng sử dụng các chức năng quản trị các trang hệ thống System NỘI DUNG: 1. Menu My Count Đây là menu để xem và cập nhật thông tin của user admin.

More information

PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG NÂNG CAO

PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG NÂNG CAO ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC KINH TẾ - LUẬT KHOA HỆ THỐNG THÔNG TIN TS LÊ HOÀNH SỬ (Chủ biên) ThS HỒ TRUNG THÀNH ThS TRẦN DUY THANH GIÁO TRÌNH PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG NÂNG

More information

B3: Bên khung Package Explore bên trái đi tới thư mục res, bạn sẽ thấy có 3 thư mục con:

B3: Bên khung Package Explore bên trái đi tới thư mục res, bạn sẽ thấy có 3 thư mục con: B3: Bên khung Package Explore bên trái đi tới thư mục res, bạn sẽ thấy có 3 thư mục con: - drawable: thư mục chứa các hình ảnh để làm icon hoặc tài nguyên cho giao diện... - layout: chứa các file xml để

More information

Môn Học: Cơ Sở Dữ Liệu 2. Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN

Môn Học: Cơ Sở Dữ Liệu 2. Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN Môn Học: Cơ Sở Dữ Liệu 2 Chương 3 LẤY DỮ LIỆU TỪ NHIỀU NGUỒN ThS. NGUYỄN MINH TUẤN Nội dung 3.1. Import/Export dữ liệu 3.2.Các công cụ chuyển dữ liệu (Data Transfer Tools) 3.3. Dịch vụ chuyển và chuyển

More information

PHÁT TRIỂN ỨNG DỤNG WEB

PHÁT TRIỂN ỨNG DỤNG WEB Bài giảng PHÁT TRIỂN ỨNG DỤNG WEB Lê Đình Thanh Bộ môn Mạng và Truyền thông Máy tính Khoa Công nghệ Thông tin Trường Đại học Công nghệ, ĐHQGHN E-mail: thanhld@vnu.edu.vn, thanhld.vnuh@gmail.com Mobile:

More information

BẢO MẬT TRONG SQL SERVER

BẢO MẬT TRONG SQL SERVER Chương 8 SECURITY 1 BẢO MẬT TRONG SQL SERVER Bảo mật trong SQL Server gồm 3 lớp : Login security : kiểm soát ai có thể log vào SQL Server. Database access security : kiểm soát ai có thể truy cập vào một

More information

Parallels Cloud Server 6.0

Parallels Cloud Server 6.0 Parallels Cloud Server 6.0 Hướng dẫn sử dụng nhanh 20 08-2013 1 CHƯƠNG 1 Tổng quan Parallels Cloud Server là giải pháp hạ tầng điện toán đám mây cho phép triển khai hệ thống công nghệ thông tin trên cụm

More information

2.4. GIAO THỨC MQTT Các khái niệm cơ bản MQTT được phát triển bởi IBM và Eurotech, phiên bản mới nhất là MQTT 3.1 MQTT (Giao vận tầm xa) là

2.4. GIAO THỨC MQTT Các khái niệm cơ bản MQTT được phát triển bởi IBM và Eurotech, phiên bản mới nhất là MQTT 3.1 MQTT (Giao vận tầm xa) là 2.4. GIAO THỨC MQTT 2.4.1. Các khái niệm cơ bản MQTT được phát triển bởi IBM và Eurotech, phiên bản mới nhất là MQTT 3.1 MQTT (Giao vận tầm xa) là giao thức truyền message theo mô hình cung cấp/thuê bao

More information

SIEMENS INDUSTRIAL NETWORKS

SIEMENS INDUSTRIAL NETWORKS SIEMENS INDUSTRIAL NETWORKS 1 ASI NETWORK INTRODUCTION Number of slaves Up to 62 Number of I/Os Up to 496 inputs and 496 outputs Medium Line length Cycle time Data transfer Unshielded two-wire line for

More information

MA NG MA Y TI NH (Computer Networks)

MA NG MA Y TI NH (Computer Networks) TRƯỜNG ĐA I HỌC CÔNG NGHIỆP THỰC PHẨM TP.HCM MA NG MA Y TI NH (Computer Networks) Giảng viên: ThS. Trần Đă c Tô t Khoa CNTT Email: tottd@cntp.edu.vn Website: www.oktot.com Facebook: https://www.facebook.com/oktotcom/

More information

NHẬP MÔN LẬP TRÌNH KHOA HỌC DỮ LIỆU. Bài 10: Thư viện Pandas (2)

NHẬP MÔN LẬP TRÌNH KHOA HỌC DỮ LIỆU. Bài 10: Thư viện Pandas (2) NHẬP MÔN LẬP TRÌNH KHOA HỌC DỮ LIỆU Bài 10: Thư viện Pandas (2) Nội dung 1. Chữa bài tập buổi trước 2. Làm việc với panel 3. Chọn và nhóm phần tử 4. Sử dụng pandas trong bài toán thực tế 5. Bài tập TRƯƠNG

More information

Bài 10: Cấu trúc dữ liệu

Bài 10: Cấu trúc dữ liệu KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN CÔNG NGHỆ PHẦN MỀM Bài 10: Bài giảng LẬP TRÌNH CƠ BẢN Tài liệu tham khảo Kỹ thuật lập trình C: cơ sở và nâng cao, Phạm Văn Ất, Nhà xuất bản KHKT Chương 7 2 Mục tiêu Tìm

More information

Câu 1. Thiết bị nào sau đây dùng để kết nối mạng? a)ram b)rom c)router d)cpu Câu 2. Hệ thống nhớ của máy tính bao gồm: a) Bộ nhớ trong, Bộ nhớ ngoài

Câu 1. Thiết bị nào sau đây dùng để kết nối mạng? a)ram b)rom c)router d)cpu Câu 2. Hệ thống nhớ của máy tính bao gồm: a) Bộ nhớ trong, Bộ nhớ ngoài Câu 1. Thiết bị nào sau đây dùng để kết nối mạng? a)ram b)rom c)router d)cpu Câu 2. Hệ thống nhớ của máy tính bao gồm: a) Bộ nhớ trong, Bộ nhớ ngoài b) Cache, Bộ nhớ ngoài c) Bộ nhớ ngoài, ROM d) Đĩa quang,

More information

[ASP.NET] MVC Framework và ví dụ minh họa

[ASP.NET] MVC Framework và ví dụ minh họa [ASP.NET] MVC Framework và ví dụ minh họa Đây là bài dịch từ một số bài blog của tác giả Scott Guthrie về ASP.NET MVC Framework về một công nghệ mới ra đời của ASP.NET. Một hạn chế của framework ASP.NET

More information

LÂ P TRI NH WEB ASP.NET

LÂ P TRI NH WEB ASP.NET Trươ ng Đa i Ho c La c Hô ng 2009-2010 LÂ P TRI NH WEB ASP.NET Ts. Vu Đư c Lung Ks. Phan Hư u Tiê p Chương 6: Building and Managing Website 1 http://lhu.edu.vn LHU Xây dựng và quản lý Website ASP.NET OBJECTS

More information

KIẾN TRÚC MÁY TÍNH. Giảng viên: ThS. Phan Thanh Toàn. v

KIẾN TRÚC MÁY TÍNH. Giảng viên: ThS. Phan Thanh Toàn. v KIẾN TRÚC MÁY TÍNH Giảng viên: ThS. Phan Thanh Toàn 1 BÀI 4 CẤU TRÚCBUS TRONG MÁY VI TÍNH Giảng viên: ThS. Phan Thanh Toàn 2 MỤC TIÊU BÀI HỌC Liệt kêđược cácloại bus trong hệ thống. Mô tảđược các bus cơ

More information

Bài 13: C++11. EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội

Bài 13: C++11. EE3490: Kỹ thuật lập trình HK1 2017/2018 TS. Đào Trung Kiên ĐH Bách khoa Hà Nội Bài 13: C++11 1 Các phiên bản C++ C++98 (đã học trong các bài trước): Được ISO chuẩn hoá lần đầu tiên C++03: Một số thay đổi nhỏ C++0x / C++11: Rất nhiều cập nhật mới Nhiều tính năng được lấy lại từ thư

More information

FCAPS. nhìn từ quan điểm ITIL. Công cụ ManageEngine và ứng dụng khung ITIL trong các tổ chức, doanh

FCAPS. nhìn từ quan điểm ITIL. Công cụ ManageEngine và ứng dụng khung ITIL trong các tổ chức, doanh Công cụ ManageEngine và ứng dụng khung ITIL trong các tổ chức, doanh nghiệp @VN FCAPS nhìn từ quan điểm ITIL Trình bày bởi: Lưu Văn Hậu, VP Customer Relations i3 Network Systems Đối tác duy nhất của ManageEngine

More information

BÀI LAB ĐỔI TÊN DOMAIN

BÀI LAB ĐỔI TÊN DOMAIN BÀI LAB ĐỔI TÊN DOMAIN Monday, 9. April 2007, 09:27:03 Hệ thống mạng Bài viết được copy từ webiste của Nhất Nghệ http://nhatnghe.com/tailieu/renamedomain.htm Mục đích: Đổi tên domain Nhatnghe.com thành

More information

Bài tập căn bản Visual Basic.Net Vòng lặp. txtn. txtketqua. btntinh. txtn. txtketqua. btntinh. Trang 1

Bài tập căn bản Visual Basic.Net Vòng lặp. txtn. txtketqua. btntinh. txtn. txtketqua. btntinh. Trang 1 1. Tính n! Ví dụ: 5!= 1 * 2 * 3 * 4 * 5 = 120 Thiết kế form theo mẫu hoặc tự thiết kế theo ý thích. Chú ý nếu đặt tên các control khác với hình bên dưới thì cần sửa lại code cho phù hợp. btntinh Doube

More information

Cấu hình Router FTTH ---X---

Cấu hình Router FTTH ---X--- Cấu hình Router FTTH ---X--- Cấu hình Router FTTH Comtrend CT-820C 1. Một số chú ý với Router trước khi sử dụng Kiểm tra hoạt động của Router bằng cách cắm đủ 3 dây tín hiệu vào Router với các jack tương

More information

ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN

ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN BM01.QT02/ĐNT-ĐT TRƯỜNG ĐH NGOẠI NGỮ - TIN HỌC TP.HCM KHOA CÔNG NGHỆ THÔNG TIN CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập Tự do Hạnh Phúc 1. Thông tin chung về học phần ĐỀ CƯƠNG CHI TIẾT HỌC PHẦN - Tên

More information

ĐỀ CƯƠNG BÀI GIẢNG HỌC PHẦN: AN NINH MẠNG

ĐỀ CƯƠNG BÀI GIẢNG HỌC PHẦN: AN NINH MẠNG HỌC VIỆN KỸ THẬT QUÂN SỰ KHOA CÔNG NGHỆ THÔNG TIN ĐỀ CƯƠNG BÀI GIẢNG HỌC PHẦN: AN NINH MẠNG Bộ môn: An ninh mạng Giáo viên: 1) Nguyễn Hiếu Minh 2) Nguyễn Đức Thiện 1. Bài (chương, mục): Chương 4: Công

More information

SMS Live Hướng dẫn sử dụng

SMS Live Hướng dẫn sử dụng Operation Manual Table of Contents SMS Live Hướng dẫn sử dụng Hướng dẫn: Quản lý toàn bộ hồ sơ của 1 lô hàng Quản lý chứng từ hàng xuất Quản lý chứng từ hàng nhập Quản lý các khoản thu & khoản chi Và nhiều

More information

Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5.

Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5. Lab01: M V C Lưu ý: Để thực hành, các bạn phải cài Visual Studio 2013 trở lên mới hỗ trợ MVC5. 1 Mục đích Giới thiệu mô hình MVC Model, Controller, View Phân biệt ViewData, ViewBag, TempData 2 Khởi động

More information

TÌM HIỂU WINDOWS SERVER UPDATE SERVICE TRONG WINDOWS SERVER 2008

TÌM HIỂU WINDOWS SERVER UPDATE SERVICE TRONG WINDOWS SERVER 2008 TÌM HIỂU WINDOWS SERVER UPDATE SERVICE TRONG WINDOWS SERVER 2008 Managing Software Update ICT24H TEAM 2010 Công nghệ càng ngày càng phát triển dẫn đến máy tính càng ngày càng dễ dàng quản lý hơn. Phần

More information

Mô hình dữ liệu quan hệ (Relational data model)

Mô hình dữ liệu quan hệ (Relational data model) Mô hình dữ liệu quan hệ (Relational data model) 1 Nội dung 1. Mô hình dữ liệu quan hệ (Relational data model) 2. Phép toán tập hợp (Set Operation) 3. Phép toán đại số quan hệ (Relational Algebra Operation)

More information

LINQ TO SQL & ASP.NET

LINQ TO SQL & ASP.NET Chương 13 LINQ TO SQL & ASP.NET Sau khi học xong bài này, học viên có khả năng : - Xây dựng được ứng dụng ASP.NET tương tác với Cơ sở dữ liệu thông qua mô hình 2 tier - Sử dụng được LINQ to Object để truy

More information

Time Picker trong Android

Time Picker trong Android Time Picker trong Android Time Picker trong Android cho phép bạn lựa chọn thời gian của ngày trong chế độ hoặc 24 h hoặc AM/PM. Thời gian bao gồm các định dạng hour, minute, và clock. Android cung cấp

More information

Bài 7: Các cấu trúc điều khiển

Bài 7: Các cấu trúc điều khiển KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN CÔNG NGHỆ PHẦN MỀM Bài 7: Bài giảng LẬP TRÌNH CƠ BẢN Nội dung Tìm hiểu về cấu trúc lựa chọn Lệnh if Lệnh if else Lệnh nhiều if Lệnh if lồng nhau Lệnh switch 2 Nội dung Tìm

More information

CHỦ NHIỆM ĐỀ TÀI: ThS. Đỗ Đình Trang

CHỦ NHIỆM ĐỀ TÀI: ThS. Đỗ Đình Trang ĐỀ TÀI KHOA HỌC CẤP TRƯỜNG NĂM HỌC 2012 2013 ĐỀ TÀI TÀI LIỆU THAM KHẢO VỀ QUẢN TRỊ VÀ BẢO TRÌ MẠNG (Mã số đề tài: 201207) Hướng dẫn cài đặt và cấu hình CHỦ NHIỆM ĐỀ TÀI: ThS. Đỗ Đình Trang 2 MỤC LỤC 1

More information

Các virus đầu tiên xuất hiện trong hệ điều hành của máy tính Apple II

Các virus đầu tiên xuất hiện trong hệ điều hành của máy tính Apple II VIRUS 1 I. Giới thiệu: virus máy tính (thường được người sử dụng gọi tắt là virus) là những chương trình hay đoạn mã được thiết kế để tự nhân bản và sao chép chính nó vào các đối tượng lây nhiễm khác (file,

More information

BÀI THỰC HÀNH SỐ 1. Quản trị tập tin: 1/ Tạo các thư mục sau: Bài tập thực hành linux Linuxlab. bt1 bt11 bt111. bt121. bt12. bh1 bh11 bh111.

BÀI THỰC HÀNH SỐ 1. Quản trị tập tin: 1/ Tạo các thư mục sau: Bài tập thực hành linux Linuxlab. bt1 bt11 bt111. bt121. bt12. bh1 bh11 bh111. Bài tập thực hành linux Linuxlab Quản trị tập tin: 1/ Tạo các thư mục sau: BÀI THỰC HÀNH SỐ 1 bt bt1 bt11 bt111 bt12 bt121 bh bh1 bh11 bh111 bh2 bh112 Tạo thư mục bt: Tạo thư mục bh: 2/ Sử dụng lệnh cat

More information

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009

Khối: Cao Đẳng nghề và Trung Cấp Năm 2009 Hướng Dẫn Thực Hành Lập Trình Windows Nâng Cao Khối: Cao Đẳng nghề và Trung Cấp Năm 2009 Hướng dẫn: Bài tập thực hành được chia làm nhiều Module Mỗi Module được thiết kế cho thời lượng là 3 tiết thực hành

More information

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (Dùng cho sinh viên hệ đào tạo đại học từ xa) Lưu hành nội bộ HÀ NỘI - 2007 LỜI NÓI ĐẦU Cấu trúc dữ liệu và giải thuật là một trong

More information

Các kiểu định địa chỉ họ MSC-51

Các kiểu định địa chỉ họ MSC-51 Các kiểu định địa chỉ họ MSC-51 Có 8 kiểu định địa chỉ trong 8051: 1. Thanh ghi (register) dùng trong trường hợp dữ liệu chứa trong thanh ghi (register data). 2. Tức thời (immediate) dùng cho dữ liệu hằng

More information

3 cách Backup Profile trong Windows 7

3 cách Backup Profile trong Windows 7 3 cách Backup Profile trong Windows 7 Nếu bạn là người từng sử dụng Windows 7, hãy để ý trong ổ c (ổ cài đặt hệ điều hành) bạn sẽ thấy một thư mục có tên Users. Đây là thư mục lưu trữ toàn bộ hồ sơ bao

More information

Rà soát pháp luật Việt Nam với các cam kết của Hiệp định thương mại tự do Việt Nam - EU về Mua sắm công. Phòng Thương mại và Công nghiệp Việt Nam

Rà soát pháp luật Việt Nam với các cam kết của Hiệp định thương mại tự do Việt Nam - EU về Mua sắm công. Phòng Thương mại và Công nghiệp Việt Nam Phòng Thương mại và Công nghiệp Việt Nam Rà soát pháp luật Việt Nam với các cam kết của Hiệp định thương mại tự do Việt Nam - EU về Mua sắm công Nhà xuất bản Công thương Quan điểm trong Báo cáo này là

More information