Android Fragment

Câu hỏi

Đối với một ứng dụng Web theo chuẩn REST ta đã chứng minh được chỉ cần 7 actions (Index, New, Create, Edit, Update, Show, Destroy ) là có thể đáp ứng được tất cả các yêu cầu của user thao tác với hệ thống, vậy ta có thể áp dụng điều này trong một ứng dụng Android.

(Em là một nhân viên Rails, và em là một amateurs Android nên em đang tò mò muốn trả lời câu hỏi trên, em đã tìm hiểu và tự trả lời đc, vì thế hum nay em viết ra suy nghĩ của mình để mọi người cùng cho em góp ý cho em ạ).

Index

  1. MVC - MVP android.
  2. Activity (Controller)
  3. Layout (View)
  4. Model
  5. REST in Android
  6. Fragments
  7. Demo
  8. Thank you!!!

Answer

1. MVC - MVP android

MVC

mvc.png

  • MVC là một mô hình phổ biến có thể áp dụng trong mọi project sofware, ngoài MVC android còn có thể áp dụng thêm một số design parttern như MVVM (model-view-view model), MVP (model-view-presenter). Cho dù là áp dụng một design nào đi nữa thì mục đích đều là làm cho app của chúng ta dễ mở rộng, dễ duy trì, và có thể làm theo team được.
  • Trong android
    • Activity đóng vai trò là Controller, xử lý việc tương tác với người dùng
    • Layout (XML, Java) đóng vai trò là View,
    • Model là một class ta tạo ra để ánh xạ với một Object trong Database hoặc Object của API
  • Model: Render ra cái gì, là một object chứa những dữ liệu cần thiết để render, xử lý dữ liệu trước khi render. (What to render)
  • View: Render như nào, là một object mô tả vị trí, kích thước, màu sắc để render (How to render)
  • Controller: xử lý tương tác với người dùng (Events, user input).
MVP

MVC_MVP.png

Sự khác nhau giữa MVC - MVP là gì ?

=>

Sự khác nhau giữa MVC - MVP
  • Trong MVC Bất kỳ thay đổi trên Model sẽ được gửi notify cho View (nhờ việc dùng Observer design pattern), theo điều này, View sẽ luôn được up-to-date đối với Model mà view đó đang render.(data binding)

  • Trong MVP ModelView Không liên lạc trưcj tiếp với nhau, việc đồng bộ giữa data của Model với View đều thông qua tầng Presenter

  • Trong MVC View biết được Model có gì thay đổi và chúng tương tác trực tiếp với nhau, trong MVP, Model và View không biết gì về nhau và phải thông qua Presenter

2. Activity (Controller)

basic-lifecycle.png

  • Một Activity đóng vai trò là một controller trong Android, Một controller sẽ tương tác với một object duy nhất, vì thế một Activivy làm nhiệm vị quản lý một object trong hệ thống.

  • Trong một ứng dụng Android vòng đời Activity sẽ được quản lý bởi hệ thống, nghĩa là các trạng thái của instance của activity sẽ được hệ thống quản lý theo tương tác của người dùng.

  • Ví dụ: Khi người dùng touch để mở ra một màn hình giao diện, Một activity quản lý màn hình giao diện đó sẽ được khởi động lần đầu tiên và Activity đó ở trạng thái onCreate, và hàm onCreatecủa activity sẽ được gọi

  • Khi user touch để chuyển sang một màn hình khác lúc này Activity cũ sẽ được onPause và hàm onPause sẽ được gọi, tiếp đó là một Instance của một activity mới sẽ được khởi tạo và gọi tới hàm onCreate

  • Controller làm cầu nối giữa Model và View, Controller gọi Model để nhận được dữ liệu cầu hiển thị, sau đó controller truyền dữ liệu đó cho View, View sẽ làm nhiệm vụ thể hiện cách để show ra những dữ liệu đó

  • onCreate(), onPause(), onResum()... là một “lifecycle” method , được tự động gọi bởi hệ thống.

3. Layout (View)

  • View trong Android vừa có thể dùng code Java hay cũng có thể dùng code XML
  • XML sẽ trả lời câu hỏi "Render như nào?"

4. Model

  • Package model sẽ bao gồm tất cả các Class được ánh xạ tương ứng với các table trong Database hoặc các objec ta cần quản lý trong hệ thống
  • Mỗi model sẽ đảm nhiệm công việc sử lý logic trên tập dữ liệu của chính object đó.

5. REST in android

  • Ta biết Một Activity chỉ nên render một View: ví dụ một Actyvity chỉ nên có một lần set view cho nó
  • setContentView(View view) => Chỉ nên set một lần

-> Nếu như 2 gạch đầu dòng trên thì nghĩ là nếu có bao nhiều màn hình UI(Layout/View) ta sẽ phải có bấy nhiêu Activity(Controller)

-> Vậy có cách nào trong một activity ta có thể render ra nhiều view, và việc render ra các view này phụ thuộc vào action của người dùng.

Ví dụ: Ta cần quản lý Object User trong hệ thống: User sẽ có những action như

  • Tạo mới user (user_new.xml)
  • Thay đổi thông tin User (user_edit.xml)
  • Hiển thị thông tin User (user_show.xml)

Ứng với ba actions này ta cần có 3 View nhưng chúng đều nằm trong một Controller là User_Controller

  • Ta cần đến khái niệm Fragments để giải quyết một Activyti sẽ render ra nhiều Layout.

6. Fragments

Fragment là gì?
  • Bạn không sai nếu hiểu Fragmen Là một sub-activity
  • Fragment là một phần của Activity
  • Fragment có một View của riêng nó
  • Trong một Activity ta có thể add hoặc remove một hoặc nhiều Fragment
  • Một Fragment có thể dùng cho nhiều Activity
  • "Life cycle" của một Fragment tương tự như của Activity chưa nó, Khi Activity ở rạng thái pause thì Fragment sẽ ở trạng thái Stop.
  • Khái niệm Fragment có trong Android từ version 11.

Cách tạo Fragment

  • Nếu để tạo một Activity ta extends class Activity, thì để tạo một Fragment ta sẽ kế thừa class Fragment
    public static class ExampleFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.example_fragment, container, false);
        }
    }

Vòng đời Fragment

fragment.jpg

Ý tưởng dùng Fragment để một Activity(Controller) sẽ chứa các Layout(View) giống như theo REST
  • Ta tạo Một Activity(Controller) là User

  • Tiếp theo tạo Các Fragment tương ứng với từng action

    • NewFragment
    • EditFragment
    • ShowFragment
  • Tạo 3 View cho 3 Fragment

    • user_new.xml
    • user_edit.xml
    • user_show.xml
  • Sau đó User Activity sẽ quản lý các Fragment này

    • Nếu User touch Signin ta sẽ render ra NewFragment
    • Nếu User touch Edit ta sẽ render ra EditFragment
    • Nếu user touch Profile ta sẽ render ra ShowFragment.
  1. Demo
  • Em đã tạo một demo nhỏ ạ.

https://github.com/leminhtuan2015/mvc-mvvm

Em cảm ơn ạ.