1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Lập trình di động android: Phần 2 - ThS.Bùi Trung Úy

44 12 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Tiếp nội dung phần 1, Bài giảng Lập trình di động android: Phần 2 cung cấp cho người học những kiến thức như: fragment và giao diện nâng cao; quản lý dữ liệu trong android. Mời các bạn cùng tham khảo!

Bài giảng Lập Trình Di Động - Android Chương FRAGMENT VÀ GIAO DIỆN NÂNG CAO Trong chương này, tìm hiểu khái niệm phân mảnh giao diện, cách sử dụng chúng để tạo giao diện phức tạp số đối tượng điều kiển hộp thoại điều kiển hiển thị dạng danh sách 4.1 Android Fragment 4.1.1 Fragment gì? Trong phần trước tìm hiểu qua Activty giao diện “màn hình” ứng dụng, hình Activity Tuy nhiên máy tính bảng đời với hình lớn nhiều so với điện thoại truyền thống, cho phép thiết kế với nhiều loại view khác nhau, phát sinh nhu cầu dùng lại view hình khác (điện thoại máy tính bảng) Khái niệm fragment sinh nhằm phục vụ nhu cầu Có thể hiểu fragment “tiểu Activity”, chứa tập hợp view khác bên Fragment ln ln chứa Activity fragment khác, Activity chứa nhiều fragment Một ví dụ điển hình việc sử dụng fragment trường hợp thiết kế “master-detail”, bao gồm view: view tổng quan chứa danh sách đối tượng (danh sách tiêu đề báo chẳng hạn), view chi tiết, hiển thị nội dung đối tượng (bài báo) chọn Mỗi view đặt fragment Trên hình điện thoại, kích thước hạn chế, fragment nằm activity khác nhau, hình máy tính bảng, fragment nằm Activity Thiết kế giúp việc dùng lại code tối đa, logic ứng dụng nằm fragment, dùng lại cho điện thoại máy tính bảng, cịn Activity khung chứa tối thiểu mã nguồn ThS Bùi Trung Úy 90 Bài giảng Lập Trình Di Động - Android Khái niệm fragment đưa vào từ phiên Android 3.0 HoneyComb, nhiên tính Google bổ sung cho API thấp (từ Level 4) thông qua thư viện hỗ trợ Android Support Library v4 Yếu tố việc sử dụng Fragment giúp xây dựng giao diện cách chủ động linh hoạt để thích ứng với kiểu hình có kích thước khác từ điện thoại máy tính bảng, nói xác tối ưu hóa giao diện cho loại thiết bị, kích thước độ phân giải khác Mỗi Fragment module độc lập có ràng buộc chặt chẽ vào Activity mà gắn vào Fragment tái sử dụng nhiều Activity, activity gắn vào nhiều Fragment Dưới số ưu điểm bật mà Fragment mang lại: Module hóa (modularity): Với Activity phức tạp code implement Fragment Mỗi Fragment module độc lập Điều làm cho code dễ tổ chức bảo trì tốt Tái sử dụng (reusability): Viết code implement tương tác với người dùng phần UI vào fragment để chia sẻ chúng với Activity khác Hỗ trợ đa hình: Fragment cung cấp cách thức để trình bày giao diện người dùng (UI) phù hợp tối ưu cho loại thiết bị Android có kích thước hình mật độ điểm ảnh khác 4.1.2 Sử dụng Fragment * Tạo Fragment Để tạo fragment mới, bạn tạo lớp thừa kế từ lớp Fragment Thiết lập giao diện implement chức đóng gói ThS Bùi Trung Úy 91 Bài giảng Lập Trình Di Động - Android Để thiết lập giao diện cho fragment, bạn ghi đè phương thức onCreateView() thực gắn UI cho fragment, phương thức hệ thống Android gọi đến fragment vẽ layout public class DetailsFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Đọc file xml tạo đối tượng View View view = inflater.inflate(R.layout.details_fragment, container, false); return view; } } Không giống Activity, fragment không cần phải khai báo Manifest Fragment tồn nhúng vào Activity vịng đời sống phụ thuộc Activity * Gắn fragment vào Activity Cách 1: Thực tham chiếu Fragment từ giao diện XML Activity Để gắn fragment vào giao diện Activity, ta sử dụng thẻ sau: Cách 2: Dùng mã nguồn Java Mỗi Activity có FragmentManager để quản lý fragment bên FragmentManager cung cấp phương thức sử dụng để truy cập vào fragment gắn vào Activity: FragmentManager fragManager = getFragmentManager(); Sử dụng FragmentTransaction để thêm fragment vào Activity: FragmentTransaction fragTransaction = fragManager.beginTransaction(); fragTransaction.add(R.id.details_fragment, new DetailsFragment()); fragTransaction.commit(); Ngồi ra, FragmentTransaction có thao tác khác thêm, xóa hay thay fragment, thao tác gọi giao dịch Mỗi giao dịch gồm nhiều thao tác thực thời điểm FragmentTransaction fragTransaction = fragManager.beginTransaction(); Fragment fragment = fragManager.findFragmentById(R.id.list_fragment); fragTransaction.remove(fragment); fragTransaction.commit(); ThS Bùi Trung Úy 92 4.1.3 Vịng đời Fragment Bài giảng Lập Trình Di Động - Android Cũng giống activity, vòng đời fragment xảy trạng thái thay đổi Một kiện vòng đời Fragment xảy nhìn thấy fragment hoạt động, fragment không sử dụng bị destroy Và giống với Activity, bạn override hàm vịng đời fragment như: onCreate(), onAttach(), onCreateView()… để thực tác vụ mong muốn Dưới sơ đồ minh họa vòng đời Fragment Giải thích sơ đồ: Khi fragment tạo chạy, thực theo thứ tự sau: onAttach(): Fragment gắn vào activity Mỗi Fragment muốn chạy phải thuộc vào activity onCreate(): Khi fragment khởi tạo (hàm gọi sau fragment attach vào Activity) onCreateView(): Hàm dùng để tạo giao diện cho fragment onActivityCreated(): Khi activity fragment khởi tạo xong onStart(): Khi fragment hiển thị Một fragment start sau Activity start thường start Activity start xong onResume(): Khi fragment hiển thị tương tác ThS Bùi Trung Úy 93 Bài giảng Lập Trình Di Động - Android Các kiện bạn hệ thống destroy fragment: onPause(): Khi fragment khơng cịn tương tác (có thể hiển thị) Điều xảy fragment bị gỡ bỏ bị thay thế, activity fragment bị tạm dừng onStop(): Khi fragment khơng cịn hiển thị Điều xảy sau fragment bị gỡ bỏ thay thế, activity fragment bị tạm dừng onDestroyView(): Khi view hay resource tạo onCreateView bị remove khỏi activity destroy onDestroy(): Khi fragment kết thúc việc dọn dẹp onDetach(): Khi fragment bị tách khỏi Activity Bạn thấy vòng đời fragment đan xen với vòng đời activity Tuy nhiên, vòng đời Fragment có nhiều kiện vịng đời so với Activity Để hiểu rõ vòng đời Frament, ghi đè hàm kiện tương ứng ghi log: package com.example.helloandroid; import android.content.Context; import android.support.v4.app.Fragment; import android.os.Bundle; import android.util.Log; public class DetailsFragment extends Fragment { @Override public void onAttach(Context context) { super.onAttach(context); Log.d("Fragment", "onAttach"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("Fragment", "onCreate"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { log.d("Fragment", "onCreateView"); return null; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d("Fragment", "onActivityCreated"); } @Override public void onStart() { super.onStart(); ThS Bùi Trung Úy 94 Log.d("Fragment", "onStart"); Bài giảng Lập Trình Di Động - Android } @Override public void onResume() { super.onResume(); Log.d("Fragment", "onResume"); } @Override public void onPause() { super.onPause(); Log.d("Fragment", "onPause"); } @Override public void onStop() { super.onStop(); Log.d("Fragment", "onStop"); } @Override public void onDestroyView() { super.onDestroyView(); Log.d("Fragment", "onDestroyView"); } @Override public void onDestroy() { super.onDestroy(); Log.d("Fragment", "onDestroy"); } @Override public void onDetach() { super.onDetach(); Log.d("Fragment", "onDetach"); } } Chạy ứng dụng thiết bị Android, thực thao tác bấm phím Home, Back, mở ứng dụng khác… bạn thấy hiển thị log kiện xảy vòng đời Fragment: 11-03 23:24:29.398: D/Fragment (11354): onAttach 11-03 23:24:29.398: D/Fragment (11354): onCreate 11-03 23:24:29.398: D/Fragment (11354): onCreateView 11-03 23:24:29.398: D/Fragment (11354): onActivityCreated 11-03 23:24:29.398: D/Fragment (11354): onStart 11-03 23:24:29.398: D/Fragment (11354): onResume 11-03 23:24:33.835: D/Fragment (11354): onPause 11-03 23:24:33.835: D/Fragment (11354): onStop 11-03 23:24:33.835: D/Fragment (11354): onDestroyView 11-03 23:24:33.835: D/Fragment (11354): onDestroy 11-03 23:24:33.835: D/Fragment (11354): onDetach ThS Bùi Trung Úy 95 Thực hành với Fragment: Bài giảng Lập Trình Di Động - Android Tạo dự án với bố cục giao diện sau (với hình ảnh ví dụ trước) Các bước thực hiện: Tạo Activity có tên FragmentActvity.java ThS Bùi Trung Úy 96 Bài giảng Lập Trình Di Động - Android B2 Tiếp theo tạo file top_fragment.xml: Trên Android Studio chọn: „File/New/Layout resource file‟ Nhập thông tin sau: Thiết kế giao diện top_fragment.xml, có xml sau: ThS Bùi Trung Úy 97 Bài giảng Lập Trình Di Động - Android Tương tự tạo file bottom_fragment.xml, có XML sau: Bài giảng Lập Trình Di Động - Android Mỗi Fragment tương ứng với lớp Java Lớp mở rộng từ lớp Fragment Tạo lớp TopFragment.java BottomFragment.java sửa code sau TopFragment.java package com.example.helloandroid; import android.support.v4.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class TopFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Đọc file xml tạo đối tượng View View view = inflater.inflate(R.layout.top_fragment, container, false); return view; } } BottomFragment.java package com.example.helloandroid; import android.support.v4.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class BottomFragment extends Fragment { ThS Bùi Trung Úy 99 Bài giảng Lập Trình Di Động - Android 4.3.3 Sử dụng GridView GridView giống với ListView có chức hỗ trợ hiển thị liệu theo dạng lưới GridView dựa vào Adapter để gắn kết liệu bên dưới, điểm khác GridView có thiết lập số cột Dữ liệu đưa vào dạng mảng hay danh sách, dựa vào số cột ta thiết lập mà tự động ngắt hàng dựa vào thuộc tính numColums layout Ví dụ, tạo gridView đơn giản hiển thị phần tử dạng chử: - Thêm GridView vào layout Activity: Bài giảng Lập Trình Di Động - Android - Trong hàm onCreate Activity gắn apdapter cho GridView để hiển thị liệu: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final String[] users = new String[]{"Tom (Admin)", "Jerry (Users)", "Donald (Guest)", "Bui (Admin)", "Trung (Guest)", "Uy (Users)"}; // GridView GridView gridView1 = (GridView) findViewById(R.id.gridView1); ArrayAdapter adapter1 = new ArrayAdapter (this, android.R.layout.simple_list_item_1, users); gridView1.setAdapter(adapter1); // Khi người dùng click vào phần tử gridView1.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView arg0, View v, int position, long id) { Toast.makeText(getBaseContext(), "You have selected item : " + users[position], Toast.LENGTH_SHORT).show(); } }); } Chạy ứng dụng ta có kết quả: ThS Bùi Trung Úy 120 Bài giảng Lập Trình Di Động - Android Chương QUẢN LÝ DỮ LIỆU TRONG ANDROID Trong chương này, xem xét cách thức lưu trữ liệu Android Lưu trữ liệu tính quan trọng ứng dụng, giúp cho người dùng dùng lại liệu trước mà khơng cần tải lại 5.1 Dữ liệu Assets Android Assets thư mục chứa liệu đầu vào Chẳng hạn âm thanh, hình ảnh, sở liệu tập tin khác, Những tập tin không biên dịch ứng dụng đóng gói Để truy xuất tập tin thư mục assets, ta phải sử dụng quản lý asset Android cung cấp Lớp tên AssetManager AssetManager assetManager = Context.getAssets(); AssetManager lớp cung cấp quyền truy cập vào tập tin không biên dịch ứng dụng, cho phép bạn mở đọc file nguyên gốc dạng luồng byte Chẳng hạn, để truy xuất font chữ lưu thư mục Asset ta sử dụng sau: Typeface arial = Typeface.createFromAsset(assetManager, “font/arial.ttf”); textView.setTypeface(arial); Ví dụ, sau cho ta nhìn tổng quát cách thức sử dụng AssetManager để truy xuất tập tin thư mục assets public void loadAssetsData() { AssetManager assetManager = getAssets(); // To get names of all files inside the "Files" folder try { String[] files = assetManager.list("Files"); for(int i=0; i 0; db.close(); return res; } // -retrieves a particular contact public void getContact(long id) throws SQLException { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(true, TABLE_NAME, new String[] {FIELD_ID, FIELD_NAME, FIELD_EMAIL}, FIELD_ID + "=" + id, null, null, null, null, null); /*Cursor cursor = db.query(TABLE_NAME, new String[] { FIELD_ID, FIELD_NAME, FIELD_EMAIL }, FIELD_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null); */ if (cursor != null) { cursor.moveToFirst(); // Hiển thị contact displayContact(cursor); } // Đóng kết nối database db.close(); } ThS Bùi Trung Úy 131 Bài giảng Lập Trình Di Động - Android // -updates a contact public boolean updateContact(long rowId, String name, String email) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues args = new ContentValues(); args.put(FIELD_NAME, name); args.put(FIELD_EMAIL, email); boolean res = db.update(TABLE_NAME, args, FIELD_ID + "=" + rowId, null) > 0; // Đóng kết nối database db.close(); return res; } // -retrieves all the contacts public int getAllContacts() throws SQLException { SQLiteDatabase db = this.getWritableDatabase(); /*Cursor cursor = db.query(TABLE_NAME, new String[] {FIELD_ID, FIELD_NAME, FIELD_EMAIL}, null, null, null, null, null);*/ // Select All Query String selectQuery = "SELECT * FROM " + TABLE_NAME; Cursor cursor = db.rawQuery(selectQuery, null); // contacts count int count = cursor.getCount(); // Duyệt trỏ if (cursor.moveToFirst()) { { // Hiển thị contact displayContact(cursor); } while (cursor.moveToNext()); } cursor.close(); return count; } public void displayContact(Cursor c) { Log.d(TAG, "Contact details: " + "id: " + c.getString(0) + "\n" + "Name: " + c.getString(1) + "\n" + "Email: " + c.getString(2)); } } Trước tiên ta khai báo số: tên CSDL, tên bảng, tên trường để dễ dàng truy xuất thay đổi q trình phát triển Ngồi ta khai báo phiên CSDL ứng dụng viết sẵn câu truy vấn dùng để tạo CSDL private static final String DATABASE_NAME = "AppDB.sqllite"; private static final String TABLE_NAME = "contacts"; private static final String FIELD_ID ="_id"; ThS Bùi Trung Úy 132 Bài giảng Lập Trình Di Động - Android private static final String FIELD_NAME ="name"; private static final String FIELD_EMAIL = "email"; Trong lớp DatabaseHelper trợ giúp cho việc tạo CSDL nâng cấp cấu trúc có thay đổi phiên Lớp kế thừa từ lớp SQLiteOpenHelper Hàm dựng lớp gọi hàm dựng lớp cha với tên phiên CSDL ứng dụng: super(context, DATABASE_NAME, null, DATABASE_VERSION); Ngoài lớp ta ghi đè hàm: - Hàm onCreate(): gọi để khởi tạo CSDL lần chạy ứng dụng, hàm ta tiến hành thực thi câu lệnh tạo CSDL - Hàm onUpgrade(): gọi ta nâng cấp ứng dụng thay đổi giá trị phiên CSDL Trong ví dụ trên, có thay đổi phiên này, ta xóa CSDL cũ tạo lại Ngoài ta viết thêm hàm để tạo ghi, cập nhật ghi, lấy tất ghi, lấy ghi theo id,… Sau có lớp DatabaseHelper này, việc truy xuất CSDL trở nên tương đối đơn giản, đoạn mã minh họa thao tác thêm, bớt, truy vấn CSDL: // - thêm ghi long id = db.insertContact("Le Hoang", "lehoang@gmail.com"); long id = db.insertContact("Bui Uy", "uybt@dau.edu.com"); // lấy danh sách tất ghi db.getAllContacts(); // - lấy ghi theo id db.getContact(2); // - cập nhật ghi db.updateContact(1, "Tran Hao", "tranhao@gmail.com"); // - xóa ghi db.deleteContact(1); ThS Bùi Trung Úy 133 ... đời Fragment: 1 1-0 3 23 :24 :29 .398: D/Fragment (11354): onAttach 1 1-0 3 23 :24 :29 .398: D/Fragment (11354): onCreate 1 1-0 3 23 :24 :29 .398: D/Fragment (11354): onCreateView 1 1-0 3 23 :24 :29 .398: D/Fragment... có kết quả: ThS Bùi Trung Úy 104 Bài giảng Lập Trình Di Động - Android 4 .2 Trình đơn (menu) hộp thoại (dialog) 4 .2. 1 Sử dụng trình đơn (menu) Trình đơn dùng để hiển thị hành động thường dùng không... checkedRadioButtonId = radioGroupDiffLevel.getCheckedRadioButtonId(); editor.putInt("checkedRadioButtonId", checkedRadioButtonId); // Save editor.apply(); } ThS Bùi Trung Úy 124 Bài giảng Lập Trình Di

Ngày đăng: 23/02/2022, 10:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN