Tại sao các mảnh vỡ, và khi nào nên sử dụng các mảnh vỡ thay vì các hoạt động?


485

Trong Android API 11+, Google đã phát hành một lớp mới được gọi là Fragment.

Trong các video, Google gợi ý rằng bất cứ khi nào có thể ( link1 , link2 ), chúng ta nên sử dụng các đoạn thay vì các hoạt động, nhưng họ không giải thích chính xác lý do tại sao.

Mục đích của các đoạn và một số cách sử dụng có thể có của chúng (ngoài một số ví dụ về UI có thể dễ dàng đạt được bằng các chế độ xem / bố cục đơn giản) là gì?

Câu hỏi của tôi là về các mảnh:

  1. Mục đích của việc sử dụng một mảnh là gì?
  2. Những lợi thế và bất lợi của việc sử dụng các đoạn so với sử dụng các hoạt động / lượt xem / bố cục là gì?

Câu hỏi thưởng:

  1. Bạn có thể đưa ra một số cách sử dụng thực sự thú vị cho các mảnh vỡ? Những điều mà Google không đề cập đến trong video của họ?
  2. Cách tốt nhất để liên lạc giữa các mảnh và các hoạt động có chứa chúng là gì?
  3. Những điều quan trọng nhất cần nhớ khi bạn sử dụng các mảnh là gì? Bất kỳ lời khuyên và cảnh báo từ kinh nghiệm của bạn?


Câu trả lời:


282

# 1 & # 2 mục đích của việc sử dụng một đoạn là gì và những lợi thế và bất lợi của việc sử dụng các đoạn so với sử dụng các hoạt động / lượt xem / bố cục là gì?

Các mảnh vỡ là giải pháp của Android để tạo giao diện người dùng có thể sử dụng lại. Bạn có thể đạt được một số điều tương tự bằng cách sử dụng các hoạt động và bố cục (ví dụ: bằng cách sử dụng bao gồm). Tuy nhiên; các đoạn được nối với API Android, từ HoneyComb trở lên. Hãy để tôi giải thích;

  • Các ActionBar. Nếu bạn muốn các tab trên đó để điều hướng ứng dụng của mình, bạn sẽ nhanh chóng thấy ActionBar.TabListenergiao diện đó cung cấp cho bạn một FragmentTransactionđối số đầu vào cho onTabSelectedphương thức. Bạn có thể có thể bỏ qua điều này và làm một cái gì đó khác và thông minh, nhưng bạn sẽ làm việc chống lại API, chứ không phải với nó.

  • Các FragmentManagertay cầm «trở lại» cho bạn một cách rất thông minh. Quay lại không có nghĩa là quay lại hoạt động cuối cùng, như đối với các hoạt động thông thường. Nó có nghĩa là trở lại trạng thái mảnh trước đó.

  • Bạn có thể sử dụng tuyệt vời ViewPagervới một FragmentPagerAdapterđể tạo giao diện vuốt. Các FragmentPagerAdaptercode đang nhiều bụi hơn một bộ chuyển đổi thường xuyên, và nó điều khiển sự khởi tạo của các cá nhân.

  • Cuộc sống của bạn sẽ dễ dàng hơn rất nhiều nếu bạn sử dụng Fragment khi bạn cố gắng tạo ứng dụng cho cả điện thoại và máy tính bảng. Vì các mảnh được gắn với API Honeycomb +, bạn cũng sẽ muốn sử dụng chúng trên điện thoại để sử dụng lại mã. Đó là nơi thư viện tương thích có ích.

  • Bạn thậm chí có thể và nên sử dụng các đoạn cho các ứng dụng chỉ dành cho điện thoại. Nếu bạn có tính di động trong tâm trí. Tôi sử dụng ActionBarSherlockvà các thư viện tương thích để tạo các ứng dụng "tìm kiếm ICS", trông giống hệt như phiên bản 1.6. Bạn nhận được các tính năng mới nhất như ActionBar, với các tab, tràn, thanh hành động phân tách, chế độ xem, v.v.

Phần thưởng 2

Cách tốt nhất để giao tiếp giữa các mảnh là ý định. Khi bạn nhấn một cái gì đó trong một mảnh, bạn thường sẽ gọi StartActivity()với dữ liệu trên đó. Mục đích được truyền cho tất cả các mảnh của hoạt động bạn khởi chạy.


5
trước hết, cảm ơn. Tôi đánh giá cao những người đưa ra câu trả lời thông tin (ngắn gọn) và không chỉ cho tôi một liên kết đến một hướng dẫn. Ngoài ra, bên cạnh các tính năng bổ sung để làm việc trên các lớp đặc biệt, bạn có thể nghĩ về những lợi thế và bất lợi của việc làm việc với các đoạn ?
nhà phát triển Android

4
Tôi nghĩ rằng bạn phải trực tiếp hơn trong câu hỏi của bạn. Tôi chỉ đưa ra bốn lợi thế lớn ở trên.
Glenn Bech

2
ok, những gì về nhược điểm so với quan điểm và hoạt động tùy chỉnh?
nhà phát triển Android

2
Làm thế nào để bạn giao tiếp giữa các mảnh bằng cách sử dụng ý định? tất cả các mảnh cần phải "sống" (được thêm vào hoạt động) để chúng có thể giao tiếp với nhau?
nhà phát triển Android

55
Một mảnh không bao giờ nên nói chuyện trực tiếp với một mảnh khác - thay vào đó hãy đi qua hoạt động của cha mẹ. Bằng cách này, bạn không kết thúc với mã spaghetti nhưng dễ quản lý mã.
slott

70

Không chắc chắn bạn đang đề cập đến video nào, nhưng tôi nghi ngờ họ đang nói rằng bạn nên sử dụng các đoạn thay vì các hoạt động, vì chúng không thể thay thế cho nhau. Thực sự có một mục khá chi tiết trong Dev Guide, hãy xem xét việc đọc nó để biết chi tiết.

Nói tóm lại, các mảnh vỡ sống bên trong các hoạt động và mỗi hoạt động có thể lưu trữ nhiều mảnh vỡ. Giống như các hoạt động, chúng có vòng đời cụ thể, không giống như các hoạt động, chúng không phải là các thành phần ứng dụng cấp cao nhất. Ưu điểm của mảnh vỡ bao gồm tái sử dụng mã số và mô đun (ví dụ, bằng cách sử dụng xem danh sách tương tự trong nhiều hoạt động), bao gồm khả năng để xây dựng các giao diện đa khung (chủ yếu là hữu ích trên máy tính bảng). Nhược điểm chính là (một số) thêm phức tạp. Nhìn chung, bạn có thể đạt được điều tương tự với các chế độ xem (tùy chỉnh) theo cách không chuẩn và kém mạnh mẽ.


1
cập nhật câu hỏi. bây giờ nó có liên kết đến các video của google. cũng có, cảm ơn cho lời giải thích, nhưng tôi vẫn cần làm rõ về câu hỏi của tôi.
nhà phát triển Android

5
Đọc mục hướng dẫn dev, nó có quá nhiều chi tiết. Không chắc là bạn sẽ nhận được câu trả lời cho 'việc sử dụng các đoạn tuyệt vời' trên SO - cách để mơ hồ và không có câu trả lời duy nhất. Số 4 được trả lời cụ thể trong hướng dẫn dành cho nhà phát
Nikolay Elenkov

1
theo như tôi biết, phương pháp này tạo ra sự phụ thuộc vào hoạt động nào có thể chứa đoạn nào. Ngoài ra, xin vui lòng trả lời các câu hỏi chính (hai câu đầu tiên).
nhà phát triển Android

3
Cảm ơn nhà phát triển Android đã nhấn mạnh vào câu trả lời cho câu hỏi cơ bản. ATM Tôi chưa thấy gì hữu ích với tôi trong lớp Fragment khi sử dụng thẻ "bao gồm" XML. Các loại điều mà tôi sẽ tìm thấy giá trị sẽ là khả năng xác định một cách bố trí mà kỳ diệu sẽ biến thành những kinh nghiệm người dùng tốt nhất ở tất cả các độ phân giải. Từ những gì tôi có thể nói với bạn vẫn cần phải làm điều đó trong mã. Một giá trị tiềm năng khác sẽ là một cách để bó mã + tài nguyên vào các thành phần có thể sử dụng lại không có trong các ứng dụng tái sử dụng, nhưng một lần nữa dường như không có ở đó. Tôi muốn một lý do thực sự tốt.
Melinda Green

2
Tôi bắt đầu để hiểu cách Google đề nghị sử dụng mảnh vỡ, nhưng tôi khá đồng ý với @NikolayElenkov .. Đối với tôi, sử dụng hoạt động vẫn có vẻ là mạnh mẽ nhất và cách ít phức tạp ..
andrea.rinaldi

49

Một Fragment là một phần của giao diện người dùng hoặc hành vi của một ứng dụng có thể được đặt trong một Hoạt động cho phép một thiết kế hoạt động mô-đun hơn. Sẽ không sai nếu chúng ta nói một đoạn là một kiểu không hoạt động.

Sau đây là những điểm quan trọng về một đoạn:

  1. Một đoạn có bố cục riêng và hành vi của riêng nó với các cuộc gọi lại vòng đời của chính nó.

  2. Bạn có thể thêm hoặc xóa các đoạn trong một hoạt động trong khi hoạt động đang chạy.

  3. Bạn có thể kết hợp nhiều phân đoạn trong một hoạt động để xây dựng giao diện người dùng đa khung.

  4. Một mảnh có thể được sử dụng trong nhiều hoạt động.

  5. Vòng đời mảnh có liên quan chặt chẽ với vòng đời của hoạt động chủ của nó.

  6. Khi hoạt động bị tạm dừng, tất cả các mảnh có sẵn trong hoạt động cũng sẽ bị dừng lại.

  7. Một đoạn có thể thực hiện một hành vi không có thành phần giao diện người dùng.

  8. Các mảnh đã được thêm vào API Android trong Android 3 (Honeycomb) với API phiên bản 11.

Để biết thêm chi tiết, vui lòng truy cập trang web chính thức, Fragment .


1. Như bạn đã đề cập trên # 8, nó không phải có bố cục. 6. bạn đã bỏ lỡ phần sau "phương tiện". Dù sao, cảm ơn vì đã giúp đỡ người khác làm cho điều này rõ ràng hơn. Tôi sẽ cho bạn +1.
nhà phát triển Android

1
Về số 8, một ví dụ khả dĩ về phân đoạn không có bố cục (tức là phân đoạn 'không đầu') sẽ là một nhiệm vụ thực hiện một nhiệm vụ mặc dù hơi ngắn (như yêu cầu HTTP ngắn) vẫn được yêu cầu để tồn tại thay đổi cấu hình và do đó phụ thuộc trên cá thể mảnh chính xác đang được bảo tồn trên chúng (bằng cách sử dụng setRetainInstance (true) trên đoạn). Đối với các đoạn bố cục, setRetainInstance (true) không có ý nghĩa gì nhiều, vì nó ngăn các tài nguyên liên quan đến chế độ xem của chúng không bị giải phóng khi cần thiết (ví dụ như rò rỉ bộ nhớ).
Piovezan

LƯU Ý: "# 8" hiện là "# 7".
ToolmakerSteve

21

Đây là thông tin quan trọng mà tôi tìm thấy trên mảnh:

Trong lịch sử, mỗi màn hình trong một ứng dụng Android được triển khai dưới dạng một Hoạt động riêng biệt. Điều này tạo ra một thách thức trong việc truyền thông tin giữa các màn hình vì cơ chế Android Intent không cho phép truyền trực tiếp một loại tham chiếu (tức là đối tượng) giữa các Hoạt động. Thay vào đó, đối tượng phải được tuần tự hóa hoặc một tài liệu tham khảo có thể truy cập toàn cầu được cung cấp.

Bằng cách làm cho mỗi màn hình thành một mảnh riêng biệt, dữ liệu này vượt qua cơn đau đầu hoàn toàn tránh được. Các mảnh luôn tồn tại trong ngữ cảnh của một Hoạt động nhất định và luôn có thể truy cập Hoạt động đó. Bằng cách lưu trữ thông tin quan tâm trong Hoạt động, Đoạn cho mỗi màn hình có thể chỉ cần truy cập tham chiếu đối tượng thông qua Hoạt động.

Nguồn: https://www.pluralsight.com/blog/software-development/android-fragments


3
Điều đó đúng, nhưng có giải pháp cho việc này: sử dụng Parcelable khi nó không phải là một đối tượng lớn (và có một plugin để làm cho nó dễ dàng hơn) và nếu đó là một đối tượng lớn, bạn luôn có thể sử dụng tham chiếu tĩnh sẽ được đặt thành null khi bạn đến hoạt động mới (hoặc khi bạn phá hủy nó, tùy thuộc vào yêu cầu của bạn).
nhà phát triển Android

@androiddeveloper: "use Parcelable" phù hợp với định nghĩa của tôi về "cơn đau đầu truyền dữ liệu có thể tránh được bằng cách sử dụng Fragment". Nếu có trạng thái chia sẻ phức tạp cần duy trì trong khi một loạt các màn hình đi qua, một Activity + Fragment là một giải pháp tốt, IMHO. (Mặc dù tôi đã từ bỏ ngăn xếp Fragment back và tự mình quản lý "back" nghĩa là gì.)
ToolmakerSteve

Sử dụng mẫu thiết kế giao diện giữa các đoạn thông qua hoạt động vùng chứa là một cách tiếp cận nhiều mô-đun để vượt qua không chỉ các đối tượng mà còn nhấp vào các trình lắng nghe sự kiện và các đối số phương thức trở lại các đoạn khác hoặc cho hoạt động của thùng chứa chính.
Kaveesh Kanwal

10

Các hoạt động là các thành phần toàn màn hình trong ứng dụng với thanh công cụ, mọi thứ khác tốt nhất là các mảnh vỡ. Một hoạt động chính toàn màn hình với thanh công cụ có thể có nhiều bảng, trang có thể cuộn, hộp thoại, v.v. (tất cả các đoạn), tất cả đều có thể được truy cập từ cha mẹ và giao tiếp qua cha mẹ.

Thí dụ:

Hoạt động A, B Hoạt động, Hoạt động C:

  • Tất cả các hoạt động cần phải có cùng một mã lặp đi lặp lại, để hiển thị một thanh công cụ cơ bản chẳng hạn, hoặc kế thừa từ một hoạt động phụ huynh (trở nên cồng kềnh để quản lý).
  • Để chuyển từ hoạt động này sang hoạt động khác, tất cả chúng cần phải ở trong bộ nhớ (trên cao) hoặc một hoạt động cần phải bị phá hủy để hoạt động kia mở.
  • Giao tiếp giữa các hoạt động có thể được thực hiện thông qua Ý định.

đấu với

Hoạt động A, Đoạn 1, Đoạn 2, Đoạn 3:

  • Không có mã lặp lại, tất cả các màn hình có thanh công cụ vv từ đó một hoạt động.
  • Một số cách để di chuyển từ một mảnh để tiếp - xem máy nhắn tin, đa cửa sổ, vv
  • Hoạt động có hầu hết dữ liệu, vì vậy cần có giao tiếp giữa các đoạn tối thiểu. Nếu vẫn còn cần thiết, có thể được thực hiện thông qua giao diện dễ dàng.
  • Những mảnh vỡ không cần phải có đầy đủ màn hình, rất nhiều sự linh hoạt trong việc thiết kế chúng.
  • Các mảnh vỡ không cần phải tăng bố cục nếu không cần xem.
  • Một số hoạt động có thể sử dụng cùng một đoạn.

câu trả lời hoàn hảo!
Sathesh

8

Các mảnh được sử dụng đặc biệt trong một số trường hợp như nơi chúng tôi muốn giữ ngăn kéo điều hướng trong tất cả các trang của chúng tôi. Bạn có thể thổi phồng một cách bố trí khung với bất cứ điều gì bạn muốn phân mảnh và vẫn có quyền truy cập để ngăn điều hướng.

Nếu bạn đã sử dụng một hoạt động, bạn sẽ phải giữ ngăn kéo trong tất cả các hoạt động tạo ra mã dự phòng. Đây là một sử dụng thú vị của một đoạn.

Tôi mới dùng Android và vẫn nghĩ rằng một đoạn là hữu ích theo cách này.


Đúng. Tuy nhiên, đôi khi tôi vẫn bối rối về cách sử dụng các mảnh vỡ chính xác và đó là do vòng đời phức tạp của cả các mảnh vỡ và hoạt động.
nhà phát triển Android

@androiddeveloper bạn chỉ sử dụng các hoạt động là chủ yếu?
Michael Alan Huff

@MichaelAlanHuff Khi hỗ trợ viên, tôi nghĩ rằng nó tốt hơn để sử dụng mảnh vỡ. Ngoài ra, khi hỗ trợ thay đổi phương hướng và sự kiện tương tự khác, bạn có thể muốn sử dụng DialogFragment, vì nó cho phép bạn khôi phục lại chúng
android phát triển

@androiddeveloper, đó là những gì tôi nghĩ là tốt. Tôi đã không được sử dụng DialogFragments như thường. Để giúp mô đun hóa logic, rất nhiều nhà phát triển Android đang bắt đầu sử dụng các chế độ xem tùy chỉnh để giữ logic của một hình vuông. Đây là một cuộc nói chuyện gần đây về quan điểm tùy chỉnh được đưa ra bởi một kỹ sư từ Airbnb vimeo.com/127799187
Michael Alan Huff

@MichaelAlanHuff sử dụng các đoạn cũng có thể hữu ích nếu bạn nghĩ màn hình hiện tại có thể là một phần của màn hình khác.
android phát triển

5

Tôi biết điều này đã được thảo luận cho đến chết, nhưng tôi muốn thêm một số điểm hơn:

  • Frags có thể được sử dụng để cư trú Menuvà có thể tự xử lý MenuItemcác nhấp chuột. Do đó đem lại tùy chọn điều chế thêm tác cho hoạt động của bạn. Bạn có thể thực hiện công cụ ContextualActionBar mà không cần Hoạt động của bạn biết về nó và về cơ bản có thể tách rời nó khỏi những thứ cơ bản mà Activity của bạn xử lý (Điều hướng / Cài đặt / Giới thiệu).

  • Một Frag mẹ với frags đứa trẻ có thể cung cấp cho bạn tùy chọn hơn nữa để modulize thành phần của bạn. Ví dụ: bạn có thể dễ dàng trao đổi Frags xung quanh, đặt Frags mới vào Pager hoặc loại bỏ chúng, sắp xếp lại chúng. Tất cả không có Hoạt động của bạn biết bất cứ điều gì về nó chỉ tập trung vào các công cụ cấp cao hơn.


0

Các mảnh vỡ sống trong Hoạt động và có:

  • vòng đời của chính nó
  • bố trí riêng của nó
  • mảnh vỡ của chính nó và vv

Hãy nghĩ về Fragment như một hoạt động phụ của hoạt động chính mà nó thuộc về, nó không thể tồn tại của chính nó và nó có thể được gọi / tái sử dụng nhiều lần. Hi vọng điêu nay co ich :)


Trên thực tế, về điểm thứ hai ("bố cục riêng của nó"), đây là tùy chọn. Một mảnh không cần phải có một cái nhìn nào cả.
android phát triển

0

1. Mục đích của việc sử dụng một đoạn?

  • ans:
    1. Đối phó với sự khác biệt form-factor thiết bị.
    2. Chuyển thông tin giữa các màn hình ứng dụng.
    3. Tổ chức giao diện người dùng.
    4. Nâng cao giao diện người dùng ẩn dụ.

0

Một đoạn sống bên trong một hoạt động, trong khi một cuộc sống hoạt động của chính nó.


6
"trên chính nó"? Có lẽ "một mình"? Hay "tự nó"?
Peter Mortensen
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.