Beginning Android for Application - Chapter 3: Android User Interface
Chương 3 gồm có:
- Những ViewGroups khác nhau mà bạn có thể sử dụng để hiển thị.
- Làm thế nào để thích ứng và quản lý sự thay đổi sự định hướng màn hình.
- Cách tạo ra UI
- Cách lắng nghe UI notification.
Trong chương 2, bạn đã tìm hiểu về Activity class và vòng đời của nó. Bạn biết rằng một
activity là một phương tiện để người dùng tương tác với application. Tuy nhiên, một activity
không thể tự hiển thị trên màn hình, mà nó phải được vẽ trên màn hình sử dụng Views và
ViewGroups. Trong chường này, bạn sẽ học chi tiết cách tạo ra user interface trong Android, và
cách người dùng tương tác với chúng. Thêm vào đó, bạn sẽ tìm hiểu cách để xử lý thay đổi trên
màn hình Android khi người dùng thay đổi chiều của nó.
view. Khi đó, bất cứ text nào nằm trong EditText view sẽ tồn tại và được restored tự động khi activity đó được tạo lại. Ngược lại, nếu bạn không đặt tên EditText view sử dụng thuộc tính android:id, thì activity sẽ không cho phép text đi cùng EditText đó được tiếp tục tồn tại. Lưu trữ thông tin trạng thái trong quá trình thay đổi ở Configuration. Bây giờ, bạn đã học được việc thay đổi định hướng màn hình sẽ destroy một activity và recreate lại nó. Hãy nhớ rằng, khi một activity được tạo lại, trạng thái hiện tại của nó sẽ bị mất. Khi một activity bị kill, nó sẽ fire một hoặc cả 2 method: Thangit14.blogspot.com Thangit14@gmail.com 30 - onPause(): Method này luôn luôn được fire bất cứ khi nào một activity được kill hoặc đưa vào trạng thái background. - onSaveInstanceState(): method này được fire khi một activity được kill hoặc đưa vào trạng thài background(giống method onPause()). Tuy nhiên, không giống như method onPause(), method này không fire khi một activity được unload từ stack( giống như khi người dùng nhấn back button), bởi vì nó không cần restore trạng thái trước của nó. Nói ngắn gọi hơn, để duy trì sự tồn tại trạng thái của activity, bạn luôn luôn phải implement onPause() method. Và sau đó sử dụng cách của bạn để lưu dữ thông tin bạn muốn của activity, có thể là database, internal or external file … Nếu bạn chỉ đơn giản là muốn lưu giữ trạng thái của activity để nó có thể được phục hồi sau khi activity được tạo lại( như khi thiết bị thay đổi định hướng), một cách đơn giản hơn nhiều là implement onSaveInstanceState() method, vì nó cung cấp một Bundle object như một tham số mà bạn có thể sử dụng nó để lưu trữ trạng thái của activity. Đoạn mã sau đây chỉ cho bạn thấy bạn có thể lưu một chuỗi ID vào Bundle object trong method onSaveInstanceState(): Khi activity được tái tạo, phương thức onCreate được fire đầu tiên, sau đó là method onRestoreInstanceState(), method này sẽ cho phép bạn lấy về trạng thái mà bạn đã lưu trước đấy thông qua Bundle object. Mặc dù bạn có thể sử dụng phương thức onSaveInstanceState() để lưu trữ thông tin trạng thái, nhưng chú ý nhưng hạn chế của việc này đó là bạn chỉ có thể lưu thông tin trạng thái của bạn trong Bundle object. Nếu bạn cần lưu những cấu trúc dữ liệu phức tạp hơn, thì đây không phải là một giải pháp thích hợp. Một method khác mà bạn có thể sử dụng là onRetainNonConfigurationInstance(). Phương thức này được fire khi một activity sắp bị destroy do có sự thay đổi configuration (giống như sự thay đổi định hướng của màn hình, keyboard được availability …). Bạn có thể lưu trạng thái của dữ liệu bằng cách return chúng trong method này: Thangit14.blogspot.com Thangit14@gmail.com 31 Chú ý: Khi màn hình có sự thay đổi định hướng, sự thay đổi này là một phần của thay đổi configuration. Một sự thay đổi configuration sẽ làm cho các activity hiện thời của bạn bị destroy. Cần chú ý rằng method onRetainNonConfigurationInstance trả về một Object type, điều này cho phép bạn trả về gần như bất kì loại dữ liệu nào. Để lấy về dữ liệu đã lưu này, bạn có thể sử dụng method getLastNonConfigurationInstance() đặt trong method onCreate(). Các phương thức này rất hữu dụng khi bạn cần duy trì data trong thời gian ngắn, giống như khi bạn download dữ liệu trên internet và người dùng thay đổi định hướng màn hình. Khi đó sử dụng 2 method trên để lưu data sẽ tốt hơn nhiều việc tải lại data đó. Thangit14.blogspot.com Thangit14@gmail.com 32 Nhận biết sự thay đổi định hướng màn hình. Đôi khi bạn cần biết khi nào thì thiết bị của bạn thay đổi định hướng. Để xác định điều đó, bạn có thể sử dụng WindowManager Class. Phương thức getDefaultDisplay() trả về một Display đại diện cho màn hình của thiết bị. Bạn có thể lấy về chiều rộng, cao của nó để xác định màn hình đang ở dạng nào. Điều khiển sự thay đổi định hướng của Activity. Bạn có thể muốn đảm bảo rằng ứng dụng của bạn được hiển thị trên một định hướng nào đó của màn hình. Ví dụ, bạn có thể viết một game mà chỉ có thể view ở landscape mode. Trong trường hợp này, bạn có thể lập trình để bắt buộc có một sự thay đổi ở màn hình, sử dụng method setRequestOrientation() của class Activity. Để thay đổi sang sạng portrait mode, bạn sử dụng Bên cạnh việc sử dụng method setRequestOrientation(), bạn còn có thể sử dụng attribute android:screenOrientation trong thẻ trong file AndroidManifest.xml Thangit14.blogspot.com Thangit14@gmail.com 33 Ví dụ trên làm ngăn chặn activity chuyển sang trạng thái định hướng nào đó (ở đây là landscape mode) và ngăn không cho activity bị destroyed; vì thế activity sẽ không bị destroyed và method onCreate() sẽ không bị fired khi định hướng màn hình bị thay đổi. Có 2 giá trị khác nữa của android:screenOrientation đó là - portrait : Potrait mode - senser: Dựa theo cảm biến của máy (mặc định). Sử dụng Action Bar Bên cạnh fragments, một tính nắng mới được cung cấp trong Android3 và 4 đó là Action Bar. Ở vị trí của title bar cũ nằm ở trên cùng của màn hình, Action Bar hiển thị icon của application và title của activity cùng nhau. Ở phía bên phải của ActionBar là action items. Ví dụ dưới đây bạn có thể lập trình để ẩn hay hiển thị Action Bar. Thangit14.blogspot.com Thangit14@gmail.com 34 Thangit14.blogspot.com Thangit14@gmail.com 35 Chú ý rằng nếu bạn đã set attribute android:name để turn off the ActionBar thì khi getActionBar() method được gọi sẽ trả về null. Vì thế việc sử dụng ActionBar class được khuyến khích hơn. Thêm Action Items vào ActionBar Bên cạnh việc hiển thị application icon và activity title ở bên trái của ActionBar, bạn còn có thể hiển thị thêm những items trên thanh ActionBar. Những items này được gọi là action items. Action items là những shortcuts cho những hành động thường được thực hiện trong ứng dụng. Ví dụ, bạn có thể xây dựng một ứng dụng đọc RSS, một số action item sẽ có thể là “Refresh feed”, “Delete feed” và “Add new feed”. Thangit14.blogspot.com Thangit14@gmail.com 36 Thangit14.blogspot.com Thangit14@gmail.com 37 Thangit14.blogspot.com Thangit14@gmail.com 38 Thangit14.blogspot.com Thangit14@gmail.com 39 Thangit14.blogspot.com Thangit14@gmail.com 40 Để đảm bảo menu item sẽ xuất hiện giống như action item, bạn gọi phương thức setShowAsAction() sử dụng SHOW_AS_ACTION_IF_ROOM . Tùy chỉnh ActionItems và Application Icon Trong ví dụ trước, menu items được hiển thị mà không có text. Nếu bạn muốn hiển thị text cho action item cùng với icon, bạn sử dụng kí tự “|” cùng với MenuItem.SHOW_AS_ACTION_WITH_TEXT Thangit14.blogspot.com Thangit14@gmail.com 41 Ngoài việc click vào action item, người dùng còn có thể clik vào application icon trên Action Bar. Khi application icon được click, method onOptionItemSelected() được gọi. Để xác định application icon nào đang gọi, bạn check item ID gắn với android.R.id.home Application icon thường được sử dụng để quay về main activity của ứng dụng. Ví dụ, app của bạn có thể có một vài activities, và bạn muốn sử dụng app icon như một shortcut cho người dùng quay về activity chính của ứng dụng. Intent.FLAG_ACTIVITY_CLEAR_TOP đảm bảo rằng các activities ở trong back stack được clear khi người dùng click vfo Action Bar. Bằng cách này, nếu người dùng click vào back button, các activities khác trong ứng dụng sẽ không được hiển thị. Tạo UI bằng code. Cho đến nay, tất cả Uis mà bạn tạo ra đều sử dụng XML. Như ddax đề cập trước đó, bên cạnh việc sử dụng XML bạn còn có thể tạo UI sử dụng code. Cách này rất hữu dụng nếu UI cần được tạo ra một cách tự động. Ví dụ, giả sử bạn đang xây dựng một hệ thống đặt vé xim phim và ứng dụng của bạn sẽ hiển thị ghế của mỗi rạp sử dụng các button. Trong trường hợp này, bạn sẽ cần tự động tạo ra các UI dựa trên các rạp chiếu được chọn bởi người dùng. Thangit14.blogspot.com Thangit14@gmail.com 42 Thangit14.blogspot.com Thangit14@gmail.com 43 Bạn cần tạo một LayoutParams object để xác định layout parameter để sử dụng trong các views. Như bạn thấy, việc tạo UI bằng code khá là mất thời gian. Do đó, tự động tạo UI sử dụng code chỉ nên dùng khi cần thiết. Thangit14.blogspot.com Thangit14@gmail.com 44 Lắng nghe Notifications Người dùng tương tác với UI ở 2 level: activity level và view level. Ở activity level, Activity cung cấp các method để bạn có thể override. Một vài những method thông thường mà bạn cần biết đó là - onKeyDown : Được gọi ra khi một key được nhấn và không được xử lý bởi bất kì view nào chứa bên trong activity. - onKeyUp: Được gọi khi một key được thả ra và không được xử lý bởi bất kì view nào chứa bên trong activity. - onMenuItemSelected: Được gọi ra khi mọt panel của menu item được chọn bởi người dùng (được đề cập trong chương 5). - onMenuOpened: Được gọi ra khi một panel được opened bởi người dùng(được đề cập trong chương 5). Overriding method được định nghĩa trong một Activity Thangit14.blogspot.com Thangit14@gmail.com 45 Thangit14.blogspot.com Thangit14@gmail.com 46 Đăng kí Events for Views. View có thể fire event khi người dùng tương tác với chúng. Ví dụ, khi người dùng nhấn vào một Button view, bạn cần viết code trong event để hành động thích hợp được thực hiện. Để làm như vậy, bạn cần đăng kí một cách rõ ràng các event cho view. Sử dụng ví dụ đã làm ở trên, bạn có thể đăng kí event cho button khi nó được click sử dụng một anonymous class. Thangit14.blogspot.com Thangit14@gmail.com 47 Anonymous class: (lớp nặc danh): Là lớp không có tên. Ở đây btnListener chỉ là biến còn lớp nặc danh được tạo ra từ new onClickListener(){}; Bên cạnh việc định nghĩa một anonymous class để sử lý event, bạn còn có thể định nghĩa một anonymous inner class để xử lý event. Anonymous inner class là lớp nặc danh được định nghĩa bên trong một method. Thangit14.blogspot.com Thangit14@gmail.com 48 Bạn cũng có thể sử dụng Anonymous inner class cho Button như sau:
File đính kèm:
- Beginning Android for Application - Chapter 3 Android User Interface.pdf