[Xamarin] Hai phương pháp hoạt động của: Shared Projects, Portable Class Libraries, and .NET Standard.

Trong Xamarin có hai tùy chọn cho việc chia sẻ code trong lập trình đa nền tảng: chia sẻ tài nguyên dự án (Shared Asset Projects) và lớp thư viện di động (Portable Class Libraries). Chúng ta sẽ tìm hiểu về các lợi ích, khó khăn cũng như phương pháp hoạt động của: Shared Projects, Portable Class Libraries, and .NET Standard.

- Shared Projects hay Shared Asset Projects cho bạn viết các mã nguồn để chia sẻ cho các nền tảng khác nhau. Hỗ trợ các trình biên dịch chỉ thị để chúng ta có thể điều kiển bao gồm mã nền tảng cụ thể được biên dịch thành một tập con của các dự án đang tham chiếu Shared Projects. Ngoài ra còn có hỗ trợ IDE để giúp quản lý các chỉ thị trình biên dịch và hình dung cách mã sẽ xem xét trong từng ứng dụng. Nếu chúng ta đã sử dụng liên kết tập tin trong quá khứ để chia sẻ mã nguồn giữa các dự án, Shared Projects hoạt động theo cách tương tự nhưng với sự hỗ trợ IDE được cải thiện. Không giống như các loại Project khác Share project sau khi biên dịch sẽ không có đầu ra (tập tin DLL) thay vào đó mã nguồn sẽ được biên dịch vào các mỗi project khác nhau.

shared

Hình 2.2: Sơ đồ cấu trúc ứng dụng Shared Project 

Mã trong một dự án được chia sẻ có thể chứa các chỉ thị trình biên dịch sẽ kích hoạt hoặc vô hiệu các phần của mã tùy thuộc vào dự án ứng dụng nào đang sử dụng mã, được gợi ý bởi các hộp nền tảng màu trong sơ đồ.

Shared Projects không được biên soạn riêng, nó tồn tại hoàn toàn như một nhóm các tập tin mã nguồn có thể được bao gồm trong các dự án khác. Khi được tham chiếu bởi một dự án khác, mã được biên soạn một cách hiệu quả như một phần của dự án đó. Dự án chia sẻ không thể tham khảo bất kỳ loại dự án khác (bao gồm các dự  án chia sẻ khác).              

Lưu ý rằng các dự án ứng dụng Android không thể tham khảo các dự án ứng dụng Android khác - ví dụ như dự án thử nghiệm đơn vị Android không thể tham chiếu dự án ứng dụng Android.

Để tạo Shared Project chọn File >New solution…nhập tên cho project.

create

Hình 2.3: Giao diện tạo mới Project 

Bạn cũng có thể thêm một Shared Project bằng cách chuột phải và chọn Add >New Project.              

Mẫu: một ứng dụng đa nền tảng (Android, iOS, Windows Phone) phải cần có một Application Project. Application project là nới chứa tất cả code của ứng dụng. Ví dụ: một Project sẽ chứa các thư mục sau:

 thumuc

Hình 2.4: Giao diên cấu trúc tập tin của Share Project          

Shared: là chứa tất cả code của cho Project.

TaskyAndroid: Project Xamarin.Android.

TaskyiOS: Project Xamarin.iOS.

Lợi ích của Share Project là cho phép bạn xây dựng ứng dụng trên nhiều nền tảng, bạn có thể thêm một số chức năng trên một nền tảng bằng cách sử dụng trình biên dịch chỉ thị, hoặc xây dựng cho một số nền tảng đặt biệt (Community.CsharpSqlite.WP7).

Khó khăn của Share Project là không như các dự án khác, Share Project không có lắp rấp đầu ra.

- Portable Class Libraries Là một thành phần quan trong khác trong việc xây dựng ứng dụng đa nền tảng là có thể chia sẻ các mã nguồn trên dự án dành riêng cho nền tảng khác nhau. Tuy nhiên, điều này phức tạp bởi thực tế là các nền tảng khác nhau thường sử dụng một bộ phụ khác của .NET Base Class Library (BCL) và do đó xây dụng cấu hình cho .NET Core Library Profile là khác nhau. Điều này có nghĩa là mỗi nền tảng chỉ có thể sử dụng thư viện lớp được nhắm mục tiêu đến cùng một cấu hình, vì vậy chúng sẽ yêu cầu các dự án thư viện riêng biệt cho mỗi nền tảng. Khi tạo Application Project thông thường hoặc Library Project chương trình sẽ tạo ra tập tin DLL nó bị hạn chế làm việc trên một số nền tảng đặt biệt. Có nghĩa là nó chỉ có thể thực hiện trên nên tảng Windows Phone và không hoạt động trên iOS và Android. Khi chúng ta tạo một Portable Class Library, chúng ta có thể chọn các nền tảng mà bạn muốn mã nguồn của bạn để chạy trên các nền tảng đó.

               Tuy nhiên, khi bạn tạo Portable Class Libraries, bạn có thể chọn một sự kết hợp các nền tảng mà bạn muốn chạy mã. Sự lựa chọn tương thích chúng ra  thực hiện khi tạo Thư viện lớp Portable được chuyển thành một định danh "Profile", mô tả các nền tảng mà thư viện hỗ trợ.

               Bảng dưới đây cho thấy một số tính năng khác nhau của nền tảng .NET. Để viết một Assembly PCL được bảo đảm để chạy trên các thiết bị / nền tảng cụ thể chúng ta chỉ cần chọn hỗ trợ nào là cần thiết khi bạn tạo dự án.

sosanh

Hình 2.5: Bảng các tính năng được hổ trợ trên Xamarin

               Cột Xamarin phản ánh thực tế là Xamarin.iOS và Xamarin.Android hỗ trợ tất cả các cấu hình được vận chuyển với Visual Studio 2013 và tính sẵn có của các tính năng trong bất kỳ thư viện nào bạn tạo sẽ chỉ bị giới hạn bởi các nền tảng khác mà bạn chọn để hỗ trợ (như Windows Phone).

               Sơ đồ dưới cho thấy kiến ​​trúc của một ứng dụng nền tảng sử dụng Portable Class Libraries để chia sẻ mã, nhưng cũng sử dụng Dependency Injection để chuyển qua các tính năng phụ thuộc nền tảng

portal

Hình 2.6: Sơ đồ kiến trúc của ứng dụng sử dụng Portable Class Libraries              

Một số thuận lợi của Portabel Class Library như: cho phép chúng ta để xây dựng ứng dụng đa nền tảng với một Project duy nhất, khi bạn chỉnh sửa Project thì tất cả Project con sẽ được cập nhật. Dự án PCL có thể dễ dàng tham khảo bởi các dự án khác. Hoặc lắp ráp đầu ra có thể được chia sẻ để người khác tham khảo trong các giải pháp của họ.              

Bên cạnh đó còn có các khó khăn như: không thể sử dụng biên dịch cho từng nền tảng, chỉ có thể sử dụng một số ít lợi thế FrameWork .NET.

.NET Standard Libraries Là một đặc tả chính thức của các API của .NET được dự định có sẵn trên tất cả các runtimes NET. Động cơ đằng sau thư viện Chuẩn đang thiết lập sự thống nhất lớn hơn trong hệ sinh thái .NET .ECMA 335 tiếp tục thiết lập tính đồng nhất cho hành vi runtime NET, nhưng không có thông số tương tự cho .NET Base Class Libraries (BCL) cho việc triển khai thư viện .NET.

Chúng ta có thể nghĩ về nó như là một, đơn giản, thế hệ tiếp theo của Portable Class Library. Đây là một thư viện với một API thống nhất cho tất cả các nền tảng .NET bao gồm NET Core. Bạn chỉ cần tạo một thư viện chuẩn của .NET và sử dụng nó từ bất kỳ thời gian chạy nào hỗ trợ nền tảng chuẩn NET.

standar

Hình 2.7: Sơ đồ cấu trúc của .NET Standard             

Ưu điểm của .NET Standar Library giống vơi Portable Class Libraries                 

Khuyến điểm: không biên dịch cho từng nền tảng .NET.

Các thành phần cơ bản của dự án Xamarin

Tôi xin giới thiệu các bạn các thành phần cơ bản khi cần xây dựng ứng dụng di động bằng Xamarin

1. Tool Xamarin Previewer: Giúp bạn xem bảng thiết kế nhanh chóng với các nền tảng cụ thể iOS hay Android, tuy nhiên công cụ này chỉ giúp bạn xem trước trang thiết kế nhưng không thể design trực tiếp trên công cụ này.

--> View - Other windows -> Xamarin.Forms Previewer

2. Hình ảnh, Icon: 

     + Icon hai dạng: Inactive and Active. Bạn có thể vào website này để tạo 2 dạng icon đó, khi lưu về sẽ có sẵn các thư mục các thể loại hình ảnh cần thiết. Xem tại website này

3 Navigation (Menu): Các bạn có thể sử dụng ví dụ sau để ứng dụng vào dự án của mình. Tuy nhiên bạn cần các bước sau

     + Tạo interface IIconChange

     + Tạo ViewModel

     + Tạo các PageContent, chọn BindingContext đến ViewModel

     + Tạo sự kiện trang MainPage khi click vào các trang con

     + Tạo File MyTabsRenderer riêng cho dự án Android.

      https://montemagno.com/dynamically-changing-xamarin-forms-tab-icons-when-select/

- Bottom Nagigation Tabbled Page: Tham khảo 1, Tham khảo 2, Tham khảo 3, Tham khảo 4.

- Menu navigation dành cho giao diện MasterDetailPage. Thành phần không thể thiếu của ứng dụng. Đầu tiên chúng ta cần 1 ContentPage làm MasterPage để chứa menu, khi click vào item của menu sẽ chuyển qua các Content Page khác.

      https://xamarinhelp.com/masterdetailpage-navigation-menu-xamarin-forms/

4. Style định dạng

Mỗi nền tảng cần chỉnh định dạng và hình ảnh riêng

- Android:

* Resources\ drawable \ Hình ảnh tại đây

* Resources\ values \ styles.xml Định dạng chung tại đây

- iOS: Resources

5. Các control, User interface

+ ListView: là thành phần phổ biến nhất và quan trọng trong việc xây dựng app quản lý.

ListView là giao diện trình bày dữ liệu dạng danh sách, đặc biệt danh sách dài và có thể cuộn lên xuống. Các thành phần sử dụng với listview là:

     * Data Sources – Thành phần phổ biến của ListView, có hoặc không có data binding.

     * Cell Appearance – Tùy chỉnh giao diện (custom) của từng ô trong listview.

     * List Appearance – Tùy chỉnh giao diện (custom) của từng ô trong listview với headers và footers, có thể nhóm hoặc thay đổi chiều cao của dòng.

     * Interactivity – Điều khiển sự kiện select, thi hành pull-to-refresh, và quản lý những sự kiện khác.

     * Performance – Xử lý thự thi của listview.

6. Các dịch vụ web service

- Xây dựng các web service bằng mọi hình thức trả về ứng dụng dữ liệu dạng Json hoặc Xml 

- Tầng ViewModel (Controller) Gọi phương thứ GET hoặc POST dữ liệu từ web service qua hàm PostAsync, sau đó đọc dữ liệu trả về bằng hàm ReadAsStringAsync. Khi đã nhận dữ liệu trả về dạng Json, chúng ta cần chuyển dữ liệu Json về dạng các kiểu đối tượng trong C# để đưa dữ liệu lên giao diện bằng hàm DeserializeObject, hoặc bạn có thể sử dụng hàm để đọc XML (Link tham khảo đầy đủ về Json XML .Net). 

+ var response = await client.PostAsync(uri.ToString(),formContent);

+ var content = await response.Content.ReadAsStringAsync();

+ Items = JsonConvert.DeserializeObject<list<KieuDuLieu>>(content);

7. Cơ sở dữ liệu SqLite

- Thêm thư viện sqlite.net từ Nuget. Chuột phải dự án MyApp -> chọn Add -> chọn Add NuGet Packages…Chọn SQLite.Net PCL -> chọn Add Package

- Viết các lớp entity như DataInfo trong lập trình quản lý. Ví dụ lớp SinhVienDB có 2 trường MaSinhVien và TenSinhVien.

- Viết tầng DataAccess (Model): Trong lớp này chúng ta vẫn kết nối csdl sqlite và kèm theo các hàm cơ bản như: GetAll, Delete(id), DeleteAll, Insert(info_db), ExcuteQuery... Ví dụ. SinhVienData có các hàm LayDanhSachSinhVien, XoaSinhVien,...

- ViewModel (tương đương tầng Controller trong lập trình quản lý), xử lý gửi kết quả vào các giao diện ở View. Các giao diện PageContent được viết bằng Xaml cũng được thiết kế tại thư mục View này.

8. Truy cập định vị GPS và chụp ảnh Camera Xamarin

- Sử dụng thư viện cho GPS https://ntldev.wordpress.com/2017/06/22/su-dung-gps-voi-xamarin-forms/

- Camera tham khảo bài viết https://www.c-sharpcorner.com/article/xamarin-forms-camera-app3/

hoặc sử dụng thư viện https://xamarinhelp.com/use-camera-take-photo-xamarin-forms/

9. Code tham khảo đọc mã vạch từ camera

-

...  Đang cập nhật

 Huỳnh Lý Thanh Nhàn

https://sites.google.com/site/hltnhan/

Các lỗi thường xảy ra khi khởi tạo dự án Xamarin

Khi bạn khởi tạo một dự án Xamarin thì thường xảy ra một số lỗi tuy nhiên không biết lý do tại sao. Hôm nay tôi viết bài này với mong muốn giúp các bạn đỡ tốn thời gian để dò tìm lỗi và xử lý.

- Lỗi thứ 1 là: khi bắt đầu new project. Đầu tiền bạn phải đảm bảo rằng Visual Studio của bạn đã cài đặt đầy đủ Xamarin và thành phần cơ bản của .Net. Nếu bạn bỏ qua một số thành phần core có thể bạn sẽ không build được dự án.

- Lỗi thứ 2 làThe name 'InitializeComponent' does not exist in the current context. Khi gặp lỗi này, có thể bạn đã gấp quá, không build dự án trước mà chạy (deployed) dự án trước.

--> Cách xử lý: Bạn có thể clean solution và build lại dự án. Nếu không thành công, bạn có thể Clean Solution, sau đó đóng luôn VS rồi mở lên lại, tiếp theo là Build Solution, Sau khi hoàn thành bạn mới có thể Run (Deploy) dự án.

- Lỗi thứ 3 làEmulator Android_Accelerated_x86_Oreo cannot be started khi bạn build thì không có lỗi, nhưng khi deployed thì không được, lỗi này là do máy ảo của bị có thể bị lỗi.

--> Cách xử lý: Vào quản lý thiết bị (Android Device Manager - ADM), sau đó chọn máy ảo cần chỉnh sửa sang 86_64 bit hoặc hw_gpu_mode = host. Nếu lỗi vẫn xảy ra, thì bạn có thể new device mới phù hợp với cấu hình bạn cần.

- Lỗi thứ 4 là: Không thể deploy được do hình ảnh bạn chép vào thư mục của Android, iOS mà không include in project.

--> Cách xử lý: Show all file, chọn file cần Include, chọn Include In project.

- Lỗi thứ 5 là: Khi buil dự án từ Xamarin phiên bản cũ, nâng cấp lên xamarin.forms: ibtool exited with code 1, Compiling IB documents for earlier than iOS 7 is no longer supported

--> Cách xử lý: The problem is that your deployment target in info.plist is set to 6.0. Set it to at least 7.0 and you will be fine.

- Lỗi thứ 6 là: Không thể run dự án iOS vì chưa kích hoạt chế độ enable debugging.

Go to Build > iOS Debug. Tick the Enable Debugging box.

- Lỗi nuget configuration is invalid

C:\Users\Admin\AppData\Roaming\NuGet Xóa file nuget.config

- Lỗi Severity Code Description Project File Line Suppression State
Error No resource found that matches the given name: attr 'colorPrimaryDark'.

 

 Huỳnh Lý Thanh Nhàn

https://sites.google.com/site/hltnhan/

[Series Lập trình Xamarin Form] Build và chạy trên máy ảo

Sau khi khởi tạo solution xong, chúng ta sẽ build và chạy thử ứng dụng vừa tạo trên máy ảo xem Label "Welcome to Lập trình Xamarin.Forms! - Nguyễn Tuấn Khiêm" được đặt trong thẻ <StackLayout> với các thuộc tính HorizontalOptions="Center" và VerticalOptions="CenterAndExpand" sẽ hiển thị như thế nào? Ở đây, mình sẽ build ứng dụng trên Iphone 6 IOS 11.4.

Trong XAML gồm có 4 phần chính: Page, Layout, View, Cell. 

1. Page giống như form trong WinForm, Page gồm các loại là ContentPage, MasterDetailPage, NavigationPage, TabbedPage, CarouselPage và TemplatedPage.

 - ContentPage là loại đơn giản và thường sử dụng nhất của Page, thuộc tính của nó giống một đối tượng View, nội dung của nó thường chứa một Layout như  StackLayout, Grid, ScrollView.

 - MasterDetailPage gồm có 2 phần là MasterDetail. Master thường hiển thị một danh mục, còn Detail hiển thị chi tiết thông tin từ danh mục được chọn ở Master

 - NavigationPage quản lý các đối tượng trong Page này theo cấu trúc ngăn xếp (stack).

 - TabbedPage quản lý nhiều Page, cho phép thiết lập điều hướng (quay về trang) các Page con bằng Tab.

 -  CarouselPage tương tự TabbedPage nhưng cho phép thiết lập điều hướng (quay về trang) các Page bằng cách vuốt ngón tay.

- TemplatedPage  hiển thị nội dung toàn màn hình với điều khiển (control) mẫu và là lớp cơ sở cho ContentPage.

2. Layout là một loại View đặc biệt, có thể chứa một hoặc nhiều View khác. Các View nằm trong Layout thì được sắp xếp theo một định dạng nhất định:

- StackLayout: sắp xếp các View con tuyến tính, theo chiều ngang hoặc chiều dọc. Các View con có thể căn chỉnh Trái, Phải, Giữa.

- AbsoluteLayout: sắp xếp các View con theo tọa độ, kích thước hoặc tỉ lệ. Các View con có thể neo Trái, Phải, Giữa.

- RelativeLayout: sắp xếp các View con dựa trên ràng buộc về kích thước và vị trí của các View cha.

- Grid: sắp xếp các View con theo dạng lưới. Các dòng hoặc cột có thể điều chỉnh bằng tỉ lệ hoặc giá trị tuyệt đối.

 TO BE CONTINUED...

[Series Lập trình Xamarin Form] Khởi tạo và làm việc với XAML

 

XAML – Extensible Application Markup Language (phát âm là “zammel”) là một ngôn ngữ đánh dấu dùng để thể hiện các đối tượng trong .NET. Mặc dù XAML là một công nghệ có thể dùng để giải quyết nhiều loại vấn đề khác nhau, nhưng vai trò chính của nó là dùng để xây dựng giao diện người dùng WPF. Nói cách khác, XAML documents sẽ định nghĩa cách sắp xếp, thể hiện các control, buttons trong cửa sổ của một chương trình WPF.

KHỞI TẠO DỰ ÁN App_Test

Bước 1: Mở Microsoft Visual Studio chọn File -> New -> Project. Trong hộp thoại New Project , chọn Visual C #> Cross Platform ở bên trái, sau đó là Mobile App (Xamarin.Forms) từ danh sách ở giữa. 

Chọn vị trí cho giải pháp, đặt tên cho App_Test (hoặc bất kỳ thứ gì bạn thích) và nhấn OK.

Bước 2: Trong hộp thoại New Cross Platform App. Ở mục Select a template: chọn Blank App. Chọn .NET Standard ở mục Code Sharing Strategy ? sau đó bấm OK.

 

Bước 3: Ở phần Solution Explorer chọn MainPage.xaml để bắt đầu code với XAML.