Lợi ích của việc sử dụng Fragment trong Android thay vì Chế độ xem là gì?


102

Khi phát triển cho Android, bạn có thể đặt sdk mục tiêu (hoặc tối thiểu) của mình thành 4 (API 1.6) và thêm gói tương thích android (v4) để thêm hỗ trợ Fragments. Hôm qua tôi đã làm điều này và triển khai thành công Fragmentsđể trực quan hóa dữ liệu từ một lớp tùy chỉnh.

Câu hỏi của tôi là: lợi ích của việc sử dụng thay Fragmentsvì chỉ nhận được Chế độ xem từ một đối tượng tùy chỉnh và vẫn hỗ trợ API 1.5 là gì?

Ví dụ: giả sử tôi có lớp Foo.java:

public class Foo extends Fragment {

    /** Title of the Foo object*/
    private String title;
    /** A description of Foo */
    private String message;

    /** Create a new Foo
     * @param title
     * @param message */
    public Foo(String title, String message) {
        this.title = title;
        this.message = message;
    }//Foo

    /** Retrieves the View to display (supports API 1.5. To use,
     * remove 'extends Fragment' from the class statement, along with
     * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) 
     * @param context Used for retrieving the inflater */
    public View getView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//getView 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//onCreateView

}//Foo

Cả hai phương pháp đều rất đơn giản để tạo và làm việc với một Hoạt động, chẳng hạn như có List<Foo>hiển thị (ví dụ: thêm từng phương pháp vào a ScrollView), vì vậy, Fragmentstất cả những điều đó có thực sự hữu ích hay chúng chỉ là sự đơn giản hóa quá mức của nhận được một Chế độ xem, chẳng hạn như thông qua đoạn mã trên?


2
Các phân mảnh không nhất thiết phải có giao diện người dùng, chúng chỉ có thể là hành vi có thể tái sử dụng. Một Chế độ xem sẽ là thừa trong trường hợp đó.
Philipp Reichart

Tôi đã trả lời điều này trong một câu hỏi khác. Xem stackoverflow.com/a/14912608/909956 T; dr - đôi khi các phân đoạn cho phép bạn tạo nhiều thành phần có thể tái sử dụng hơn là dựa vào triển khai chế độ xem tùy chỉnh. xem liên kết để biết lý do.
numan salati

Câu trả lời:


172

Lý do chính để sử dụng Fragment là cho các tính năng backstack và vòng đời. Nếu không, các chế độ xem tùy chỉnh có trọng lượng nhẹ hơn và dễ triển khai hơn.

Lúc đầu, tôi thực sự đã cố gắng tạo ứng dụng điện thoại / máy tính bảng bằng cách sử dụng chế độ xem tùy chỉnh. Mọi thứ dường như hoạt động trên điện thoại VÀ máy tính bảng, thậm chí chuyển từ bảng điều khiển đơn sang bảng điều khiển chia nhỏ. Nơi tôi gặp rắc rối là với nút quay lại và vòng đời. Vì tôi chỉ cập nhật lượt xem theo cách thủ công ... nên không có gì theo dõi lịch sử lượt xem và trạng thái của chúng. Do đó, nút quay lại không hoạt động như mong đợi và rất khó tạo lại ngay cả trạng thái mới nhất trong các sự kiện vòng đời, chẳng hạn như khi xoay ứng dụng. Để khắc phục điều đó, tôi phải gói các chế độ xem tùy chỉnh của mình trong các phân đoạn và sử dụng FragmentManager để các trạng thái trước đó sẽ được lưu và tạo lại.

Tôi nhận ra sau khi trả lời rằng tôi đã đăng câu hỏi tương tự vào một năm trước đó: https://stackoverflow.com/a/11126397/618881


14
Câu trả lời rất hay. Tôi chỉ muốn thêm rằng các đoạn có thể được lồng vào nhau kể từ 4.2 hoặc hỗ trợ thư viện phiên bản 11.
kar

2
Cảm ơn @Karlo về bản cập nhật. Tôi không nghĩ rằng nó có thể về mặt khái niệm, nhưng họ đã giải quyết vấn đề đó bằng cách sử dụng FragmentManager riêng thông qua getChildFragmentManager (). Ồ, đó là API 17, không phải 11 và có sẵn thông qua Thư viện hỗ trợ.
Henry

2
Tôi vừa xem lại câu hỏi này, và kinh nghiệm của tôi cũng đã thay đổi. Đây là một câu trả lời cung cấp sự hiểu biết tốt về cả lợi ích và nhược điểm, và rất hữu ích. Cảm ơn!
Phil

2
Muốn +1 câu trả lời này, nhưng làm như vậy sẽ làm hỏng điểm số hiện tại. Ngoài ra, 70 không phải là con số yêu thích của tôi.
Behnam

1
vào năm ngoái, tôi cũng đã nghĩ rằng Fragment không cung cấp bất kỳ tính năng thông thường nào khác, nhưng tôi đã trải nghiệm rằng sau khi nhấp lại vào hoạt động, tôi đã mất tất cả các hình ảnh được tải xuống trong đó, vì vậy phải thêm triển khai bộ nhớ cache, bây giờ tôi đang nghĩ đến việc sử dụng mảnh vỡ nó có thể rất dễ dàng
Shirish Herwade

27

Tôi muốn nói rằng Fragment hữu ích trong hai trường hợp: nếu bạn chia các chế độ xem trên một số thiết bị / hướng và hiển thị chúng trong hai hoạt động và hiển thị tất cả nội dung trong một trên các thiết bị khác. Đó sẽ là một trường hợp sử dụng nếu bạn sử dụng máy tính bảng hoặc thậm chí có thể ở chế độ ngang trên điện thoại: ví dụ: bạn hiển thị danh sách các mục và chi tiết trên một màn hình. trên điện thoại hoặc ở chế độ dọc, bạn chỉ hiển thị một phần.

Một trường hợp sử dụng khác là các khung nhìn có thể sử dụng lại. Vì vậy, nếu bạn có một số khung nhìn hiển thị trên các hoạt động khác nhau và cũng thực hiện một số hành động, bạn có thể đặt hành vi này thành một phân đoạn và sau đó sử dụng lại nó. Rõ ràng là bạn cũng có thể làm điều đó với các widget tùy chỉnh.

Tôi sẽ không thấy bất kỳ lý do gì để sử dụng Fragment cho mọi Chế độ xem và tôi đoán nó sẽ chỉ là một chi phí. Tôi chỉ sử dụng chúng trong trường hợp sử dụng đầu tiên và tôi muốn nói ở đây đó là một sự đơn giản hóa.


Cảm ơn, điều này chắc chắn hữu ích. Tôi nghĩ rằng tôi sẽ gắn bó với các khung nhìn và tạo ra 'back stack' của riêng mình để làm cho chúng có thể tái sử dụng.
Phil

3

Android đã giới thiệu các phân đoạn trong Android 3.0 (API cấp 11), chủ yếu để hỗ trợ thiết kế giao diện người dùng linh hoạt và năng động hơn trên màn hình lớn, chẳng hạn như máy tính bảng. Vì màn hình của máy tính bảng lớn hơn nhiều so với màn hình của thiết bị cầm tay, nên có nhiều chỗ hơn để kết hợp và trao đổi các thành phần giao diện người dùng. Các phân đoạn cho phép các thiết kế như vậy mà bạn không cần phải quản lý các thay đổi phức tạp đối với hệ thống phân cấp chế độ xem. Bằng cách chia bố cục của một hoạt động thành các đoạn, bạn có thể sửa đổi giao diện của hoạt động trong thời gian chạy và giữ lại những thay đổi đó trong ngăn xếp phía sau được quản lý bởi hoạt động.

Ở đây bạn có thể đọc thêm.


Tôi có đọc tất cả các tài liệu, tuy nhiên tôi đang tìm kiếm cái gì đó tốt hơn giải thích lợi ích của họ, chẳng hạn như cho máy tính bảng hoặc backstack
Phil

3
  1. Phân chia hoạt động theo kịch bản - Chúng tôi có một bố cục và một hoạt động xử lý phần màn hình bên trái bên phải
  2. Phân đoạn tình huống Hoạt động chúng ta có Một bố cục cho Màn hình chính, một cho bên trái một cho bên phải

Tình huống một là tốt nếu bạn có ứng dụng đơn giản.

Tình huống hai là tốt nếu bạn muốn có Nhiều Phân đoạn và nhiều Hoạt động Phân mảnh và bạn có thể kết hợp từng loại trong số đó. Ngoài ra, bạn có thể tạo sự tương tác giữa các đoạn.

Tôi đã chia nhỏ Màn hình Fragmentactivity. Tôi có thể gọi nó bằng 'Intent Extras' và thông báo chogmentActivity biết phân đoạn nào sẽ được tải. Các phân đoạn là tốt vì chúng không có trong tệp kê khai nên bạn có thể tạo các phân đoạn có thể tái sử dụng và FragmentActvity.

Nhưng nó làm cho dự án của bạn lớn hơn. Nhưng nếu bạn thực hiện dự án lớn, bạn có thể tiết kiệm được nhiều. Bởi vì bạn có thể sử dụng cùng một Phân đoạn hoặc cùng một hoạt động Phân đoạn.

Và tôi điều rằng những mảnh vỡ này đến hơi muộn nên bạn phải cố gắng suy nghĩ theo cách mới. Có thể chỉ cần cố gắng chuyển đổi hoạt động của bạn thành FragmentActivity. Sau đó, cố gắng tìm mã có thể sử dụng lại và tạo Fragment từ nó.

Nó hữu ích nhưng tôi không biết làm thế nào ngay bây giờ. Nhưng tôi có một số ý tưởng.

Đây luôn là vấn đề. Nhóm Android đã suy nghĩ và không ai biết điều gì là tốt. Bởi vì chúng tôi hầu như không được học như trước đây và ở đây nó có một số điều mới.

Theo tôi điều đó là tốt nhưng không phải vì lý do gì mà google cho chúng ta biết.


0

Thêm một trường hợp khi sử dụng Fragment hoặc Activity qua CustomView:

Khi bạn đang sử dụng CursorLoader để quan sát các chế độ xem nhất định, ListView hoặc TextView và muốn cập nhật giá trị hiển thị của chúng bất cứ khi nào dữ liệu của ContentProvider cập nhật ở phía sau (trường hợp phổ biến nhất là bạn có dịch vụ cập nhật cơ sở dữ liệu cục bộ của mình bằng cách thăm dò dữ liệu từ cơ sở dữ liệu / đám mây từ xa theo định kỳ )


-2

Một điều lớn mà tất cả các nhận xét ở trên không đề cập đến là một phân mảnh vẫn cư trú trong bộ nhớ ngay cả khi Android giết hoạt động và khởi động lại nó khi bạn làm điều gì đó như thay đổi hướng thiết bị của mình. Điều này được thực hiện vì lý do hiệu suất nhưng cũng có thể dẫn đến kết quả không mong muốn nếu bạn mong đợi các mảnh bị phá hủy chỉ để thấy rằng chúng đang được tạo lại từ hư không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.