Tiến thoái lưỡng nan: khi nào sử dụng Phân mảnh và Hoạt động:

813
Emil Adz 2013-12-01 11:53.

Tôi biết rằng Activitieschúng được thiết kế để đại diện cho một màn hình duy nhất của ứng dụng của tôi, trong khi Fragmentsđược thiết kế để có thể sử dụng lại các bố cục giao diện người dùng với logic được nhúng bên trong chúng.

Cho đến cách đây không lâu, tôi đã phát triển một ứng dụng vì nó nói rằng chúng nên được phát triển. Tôi đã tạo một Activityđại diện cho màn hình ứng dụng của mình và sử dụng Fragment cho ViewPagerhoặc Google Maps. Tôi hiếm khi tạo một ListFragmenthoặc một giao diện người dùng khác có thể được sử dụng lại nhiều lần.

Gần đây tôi tình cờ làm được một dự án chỉ chứa 2 Activitiescái là a SettingsActivityvà cái kia là cái MainActivity. Bố cục của tập tin MainActivitychứa nhiều phân đoạn giao diện người dùng toàn màn hình ẩn và chỉ một phân đoạn được hiển thị. Về mặt Activitylogic, có rất nhiều FragmentTransitionsgiữa các màn hình khác nhau của ứng dụng.

Điều tôi thích về cách tiếp cận này là bởi vì ứng dụng sử dụng một ActionBar, nó vẫn nguyên vẹn và không di chuyển với hoạt ảnh chuyển đổi màn hình, đó là những gì xảy ra với Activitychuyển đổi. Điều này mang lại cảm giác trôi chảy hơn cho những chuyển đổi màn hình đó.

Vì vậy, tôi đoán những gì tôi yêu cầu là chia sẻ cách phát triển hiện tại của bạn về chủ đề này, tôi biết nó có thể giống như một câu hỏi dựa trên ý kiến ​​ở cái nhìn đầu tiên nhưng tôi xem nó như một câu hỏi về thiết kế và kiến ​​trúc Android ... Không thực sự là một ý kiến ​​dựa trên một.

CẬP NHẬT (01.05.2014): Tiếp theo bài thuyết trình này của Eric Burke từ Square , (mà tôi phải nói là một bài thuyết trình tuyệt vời với rất nhiều công cụ hữu ích cho các nhà phát triển Android. Và tôi không liên quan gì đến Square)

http://www.infoq.com/presentations/Android-Design/

Từ kinh nghiệm cá nhân của tôi trong vài tháng qua, tôi thấy rằng cách tốt nhất để xây dựng các ứng dụng của mình là tạo các nhóm phân đoạn đại diện cho một luồng trong ứng dụng và trình bày tất cả các phân đoạn đó trong một Activity. Vì vậy, về cơ bản bạn sẽ có cùng một số lượng Activitiestrong ứng dụng của mình với số lượng luồng. Bằng cách đó, thanh tác vụ vẫn nguyên vẹn trên tất cả các màn hình của luồng, nhưng đang được tạo lại khi thay đổi luồng có rất nhiều ý nghĩa. Như Eric Burke đã phát biểu và tôi cũng nhận ra, triết lý sử dụng càng ít Activitiescàng tốt không thể áp dụng cho mọi tình huống vì nó tạo ra một mớ hỗn độn trong cái mà anh ấy gọi là hoạt động "Chúa".

14 answers

282
sandalone 2014-09-24 00:42.

Các chuyên gia sẽ cho bạn biết: "Khi tôi nhìn thấy giao diện người dùng, tôi sẽ biết nên sử dụng một Activityhay một Fragment". Ban đầu, điều này sẽ không có ý nghĩa gì, nhưng theo thời gian, bạn sẽ thực sự biết mình có cần Fragmenthay không.

Có một cách thực hành tốt mà tôi thấy rất hữu ích cho tôi. Điều đó xảy ra với tôi khi tôi đang cố giải thích điều gì đó với con gái mình.

Cụ thể, hãy tưởng tượng một hộp đại diện cho một màn hình. Bạn có thể tải một màn hình khác vào ô này không? Nếu bạn sử dụng một hộp mới, bạn sẽ phải sao chép nhiều mục từ hộp đầu tiên? Nếu câu trả lời là Có, thì bạn nên sử dụng Fragments, vì thư mục gốc Activitycó thể giữ tất cả các phần tử trùng lặp để giúp bạn tiết kiệm thời gian tạo chúng và bạn có thể chỉ cần thay thế các phần của hộp.

Nhưng đừng quên rằng bạn luôn cần một hộp đựng ( Activity) hoặc các bộ phận của bạn sẽ bị phân tán. Vì vậy, một hộp với các bộ phận bên trong.

Cẩn thận để không sử dụng sai hộp. Các chuyên gia về Android UX khuyên (bạn có thể tìm thấy chúng trên YouTube) khi nào chúng ta nên tải một cách rõ ràng một cái khác Activity, thay vì sử dụng một cái Fragment(như khi chúng tôi xử lý Ngăn điều hướng có các danh mục). Sau khi cảm thấy thoải mái Fragments, bạn có thể xem tất cả các video của họ. Thậm chí nhiều hơn chúng là vật liệu bắt buộc.

Ngay bây giờ bạn có thể nhìn vào giao diện người dùng của mình và tìm xem bạn có cần một Activityhay Fragmentkhông? Bạn đã có được một góc nhìn mới? Tôi nghĩ bạn đã làm.

139
VJ Vélan Solutions 2013-12-01 13:02.

Triết lý của tôi là:

Chỉ tạo một hoạt động nếu nó thực sự bắt buộc. Với back stack có sẵn để thực hiện một loạt các giao dịch phân mảnh, tôi cố gắng tạo càng ít hoạt động trong ứng dụng của mình càng tốt. Ngoài ra, giao tiếp giữa các phân đoạn khác nhau dễ dàng hơn nhiều so với việc gửi dữ liệu qua lại giữa các hoạt động.

Chuyển đổi hoạt động là tốn kém, phải không? Ít nhất thì tôi tin như vậy - vì hoạt động cũ phải bị hủy / tạm dừng / dừng, được đẩy lên ngăn xếp, và sau đó hoạt động mới phải được tạo / bắt đầu / tiếp tục.

Đó chỉ là triết lý của tôi kể từ khi các mảnh vỡ được giới thiệu.

62
android developer 2013-12-01 12:16.

Vâng, theo bài giảng của Google (có thể ở đây , tôi không nhớ), bạn nên cân nhắc sử dụng Fragment bất cứ khi nào có thể, vì nó giúp mã của bạn dễ bảo trì và kiểm soát hơn.

Tuy nhiên, tôi nghĩ rằng trong một số trường hợp, nó có thể trở nên quá phức tạp, vì hoạt động lưu trữ các phân đoạn cần phải điều hướng / giao tiếp giữa chúng.

Tôi nghĩ bạn nên tự quyết định điều gì là tốt nhất cho bạn. Thường không khó để chuyển đổi một hoạt động thành một phân đoạn và ngược lại.

Tôi đã tạo một bài đăng về dillema này Tại sao lại phân mảnh và khi nào sử dụng phân mảnh thay vì các hoạt động? , nếu bạn muốn đọc thêm.

36
Francis 2019-01-04 05:59.

Kể từ Jetpack , ứng dụng Hoạt động đơn là kiến ​​trúc được ưa thích. Đặc biệt hữu ích với Thành phần Kiến trúc Điều hướng .

nguồn

29
Qylin 2015-12-04 02:47.

Tại sao tôi thích Phân mảnh hơn Hoạt động trong TẤT CẢ CÁC TRƯỜNG HỢP.

  • Hoạt động là tốn kém. Trong Fragment, các khung nhìn và trạng thái thuộc tính được tách biệt - bất cứ khi nào có một mảnh backstack, các khung nhìn của nó sẽ bị hủy. Vì vậy, bạn có thể xếp chồng nhiều Fragment hơn Activity.

  • BackstackThao tác. Với FragmentManager, thật dễ dàng để xóa tất cả các Phân đoạn, chèn nhiều hơn vào các Phân đoạn và v.v. Nhưng đối với Activity, sẽ là một cơn ác mộng khi thao túng những thứ đó.

  • Một vòng đời có thể dự đoán được nhiều . Miễn là Hoạt động của máy chủ không được tái chế. Các mảnh vỡ trong bao sau sẽ không được tái chế. Vì vậy, có thể sử dụng FragmentManager::getFragments()để tìm Fragment cụ thể (không được khuyến khích).

14
Isaac Urbina 2016-03-13 12:41.

Theo tôi nó không thực sự liên quan. Yếu tố quan trọng cần xem xét là

  1. tần suất bạn sẽ sử dụng lại các phần của giao diện người dùng (ví dụ: các menu),
  2. ứng dụng cũng dành cho máy tính bảng?

Việc sử dụng chính của các mảnh là để xây dựng các hoạt động đa phương, điều này làm cho nó trở nên hoàn hảo cho các ứng dụng đáp ứng trên Máy tính bảng / Điện thoại.

11
guest 2015-02-03 06:15.

Đừng quên rằng một hoạt động là khối / thành phần của ứng dụng có thể được chia sẻ và bắt đầu thông qua Intent! Vì vậy, mỗi hoạt động trong ứng dụng của bạn chỉ nên giải quyết một loại nhiệm vụ. Nếu bạn chỉ có một nhiệm vụ trong ứng dụng của mình thì tôi nghĩ bạn chỉ cần một hoạt động và nhiều phân đoạn nếu cần. Tất nhiên bạn có thể sử dụng lại các mảnh vỡ trong các hoạt động sau này để giải quyết các nhiệm vụ khác. Cách tiếp cận này sẽ phân tách rõ ràng và hợp lý các nhiệm vụ. Và bạn không cần phải duy trì một hoạt động với các thông số bộ lọc mục đích khác nhau cho các nhóm phân đoạn khác nhau. Bạn xác định các nhiệm vụ ở giai đoạn thiết kế của quá trình phát triển dựa trên các yêu cầu.

9
TheHebrewHammer 2015-08-06 04:27.

Điều này còn nhiều hơn những gì bạn nhận ra, bạn phải nhớ rằng một hoạt động được khởi chạy không hoàn toàn phá hủy hoạt động gọi. Chắc chắn, bạn có thể thiết lập nó sao cho người dùng của bạn nhấp vào nút để chuyển đến một trang, bạn bắt đầu hoạt động của trang đó và hủy hoạt động hiện tại. Điều này gây ra rất nhiều chi phí. Hướng dẫn tốt nhất mà tôi có thể cung cấp cho bạn là:

** Chỉ bắt đầu một hoạt động mới khi có hoạt động chính và hoạt động này mở cùng một lúc (nghĩ đến nhiều cửa sổ).

Một ví dụ tuyệt vời về thời điểm hợp lý khi có nhiều hoạt động là Google Drive. Hoạt động chính cung cấp trình khám phá tệp. Khi một tệp được mở, một hoạt động mới sẽ được khởi chạy để xem tệp đó. Bạn có thể nhấn nút ứng dụng gần đây cho phép bạn quay lại trình duyệt mà không cần đóng tài liệu đã mở, sau đó thậm chí có thể mở một tài liệu khác song song với tài liệu đầu tiên.

8
I Love Coding 2015-11-18 17:01.

Điều tôi đã làm: Sử dụng ít phân mảnh hơn khi có thể. Thật không may, nó có thể xảy ra trong hầu hết các trường hợp. Vì vậy, tôi kết thúc với rất nhiều mảnh vỡ và một ít hoạt động. Một số nhược điểm tôi đã nhận ra:

  • ActionBar& Menu: Khi 2 mảnh có tiêu đề, menu khác nhau, điều đó
    sẽ khó xử lý. Ví dụ: khi thêm đoạn mới, bạn có thể thay đổi tiêu đề của thanh tác vụ, nhưng khi bật nó lên backstackthì không có cách nào khôi phục lại tiêu đề cũ. Bạn có thể cần Thanh công cụ trong mọi phân đoạn cho trường hợp này, nhưng hãy tin tôi, điều đó sẽ khiến bạn mất nhiều thời gian hơn.
  • Khi chúng ta cần startForResult, hoạt động có nhưng phân mảnh thì không.
  • Không có hoạt ảnh chuyển tiếp theo mặc định

Giải pháp của tôi cho điều này là sử dụng Activity để bọc một đoạn bên trong. Vì vậy, chúng tôi có thanh tác vụ, menu startActivityForResult, hoạt ảnh, ... riêng biệt

5
Sanchit Bhasin 2016-06-10 09:38.

Một lợi thế lớn của fragmenthoạt động vượt quá là mã được sử dụng cho phân mảnh có thể được sử dụng cho các hoạt động khác nhau. Vì vậy, nó cung cấp khả năng tái sử dụng mã trong phát triển ứng dụng.

3
varg 2016-09-09 14:53.

sử dụng một hoạt động cho mỗi ứng dụng để cung cấp cơ sở cho việc fragment sử dụng fragmentcho màn hình, fragmentstrọng lượng bản nhẹ so với activites các mảnh vỡ là tái sử dụng mảnh vỡ được phù hợp hơn cho các ứng dụng có hỗ trợ cả điện thoại & tablet

2
Franklin Hirata 2017-09-29 13:19.

Bạn có thể tự do sử dụng một trong những cái đó.
Về cơ bản, bạn phải đánh giá đâu là ứng dụng tốt nhất cho ứng dụng của mình. Hãy suy nghĩ về cách bạn sẽ quản lý luồng kinh doanh và cách lưu trữ / quản lý các tùy chọn dữ liệu.

Hãy nghĩ về cách Fragment lưu trữ dữ liệu rác. Khi bạn triển khai phân đoạn, bạn có một gốc hoạt động để lấp đầy (các) phân đoạn. Vì vậy, nếu bạn đang cố gắng triển khai nhiều hoạt động với quá nhiều phân đoạn, bạn phải xem xét hiệu suất trên ứng dụng của mình, vì bạn đang thao tác (nói một cách thô thiển) hai vòng đời ngữ cảnh, hãy nhớ sự phức tạp.

Hãy nhớ: tôi có nên sử dụng các mảnh vỡ không? Tại sao tôi không nên?

Trân trọng.

1
Theo 2016-05-29 22:37.

Tôi sử dụng Fragment để có trải nghiệm người dùng tốt hơn. Ví dụ: nếu bạn có một Nút và bạn muốn chạy, giả sử một dịch vụ web khi bạn nhấp vào nó, tôi đính kèm một Fragment vào Activity chính.

if (id == R.id.forecast) {

    ForecastFragment forecastFragment = new ForecastFragment();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.main_content, forecastFragment);
    ft.addToBackStack("backstack");
    forecastFragment.setArguments(b);
    ft.commit();
}

Bằng cách đó, người dùng sẽ không phải di chuyển trong một hoạt động khác.

Và thứ hai, tôi thích Fragment vì bạn có thể xử lý chúng dễ dàng trong quá trình xoay.

1
Theo 2016-12-22 09:06.

Nó phụ thuộc vào những gì bạn muốn xây dựng thực sự. Ví dụ, navigation drawersử dụng các đoạn. Các tab cũng sử dụng fragments. Một triển khai tốt khác, là nơi bạn có một listview. Khi bạn xoay điện thoại và nhấp vào một hàng, hoạt động sẽ được hiển thị ở nửa còn lại của màn hình. Cá nhân tôi sử dụng fragmentsfragment dialogsvì nó chuyên nghiệp hơn. Thêm vào đó, chúng được xử lý dễ dàng hơn trong việc xoay vòng.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Đây là Tổng thống Trump đe dọa 'trợ cấp' xe điện của GM vì đóng cửa nhà máy

Đây là Tổng thống Trump đe dọa 'trợ cấp' xe điện của GM vì đóng cửa nhà máy

Trump và Giám đốc điều hành GM Mary Barra vào năm 2017. Kể từ khi tin tức nổ ra ngày hôm qua rằng General Motors đang cắt giảm việc làm ở Bắc Mỹ để chuẩn bị cho tương lai điện / xe tự hành / khủng khiếp có thể xảy ra của chúng tôi, gần như tất cả mọi người đã tự hỏi: Tổng thống Trump, người đã vận động tranh cử trên một nền tảng sẽ như thế nào của việc mang lại và duy trì việc làm ô tô của Mỹ, phải nói gì về điều này? Bây giờ chúng ta biết.

Bản vá lỗi tiếp theo của Fallout 76 sẽ mang lại một số bản sửa lỗi cần thiết

Bản vá lỗi tiếp theo của Fallout 76 sẽ mang lại một số bản sửa lỗi cần thiết

Bethesda cho biết ngày hôm nay trên Reddit, Fallout 76 sẽ có một bản vá lớn khác vào ngày 4 tháng 12, sẽ bắt đầu cố gắng khắc phục một số vấn đề lớn hơn của trò chơi. Ngoài ra, công ty cho biết họ có kế hoạch giao tiếp nhiều hơn trong tương lai về những gì nhóm Fallout 76 đang làm việc và khi nào các bản cập nhật mới cho trò chơi sẽ ra mắt.

Mạng lưới bệnh viện Công giáo sẽ không cho phép nhân viên phá thai tại phòng khám ngoài giờ làm việc

Mạng lưới bệnh viện Công giáo sẽ không cho phép nhân viên phá thai tại phòng khám ngoài giờ làm việc

Bạn có biết rằng một trong sáu bệnh nhân ở bệnh viện ở Hoa Kỳ được điều trị tại một cơ sở Công giáo? Và bạn có biết rằng quyền sở hữu của Công giáo hạn chế sâu sắc việc thiết lập các thủ tục y tế có thể được thực hiện trong các bệnh viện này, rõ ràng nhất là khi nói đến chăm sóc sức khỏe sinh sản? Bây giờ NPR báo cáo rằng sự gia tăng của các bệnh viện thuộc Công giáo đang gây khó khăn hơn cho các bác sĩ — những người bị cấm bởi các quy định do Hoa Kỳ viết.

Khói từ đám cháy rừng ở California đã đến tận thành phố New York

Khói từ đám cháy rừng ở California đã đến tận thành phố New York

Đường chân trời San Francisco bị che khuất bởi khói và khói mù do cháy rừng phía sau Đảo Alcatraz, Thứ Tư, ngày 14 tháng 11 năm 2018, ở San Francisco.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language