30/09/2018, 17:30

Chức năng của MainActivity và MainActivityFragment trong Android khác nhau như thế nào?

Chào mọi người,
Mình đang tìm hiểu về Android. Khi tạo một Android project with fragment thì sẽ có tập tin java tạo sẵn là MainActivity.javaMainActivityFragment.java.
Vậy chức năng của 2 tập tinh này khác nhau như thế nào? Mong mọi người giúp đỡ.

Mai Anh Dũng viết 19:39 ngày 30/09/2018

Cũng đang tìm hiểu Android. Theo Đạt thấy thì khi mình mới học thì chỉ code trên MainActivityFragment thôi. Còn MainActivity thì chưa đụng vào. Vào hóng câu trả lời

MainActivity

Không biết máy bạn có auto gen giống máy mình không, MainActivity (extends FragmentActivity) và MainActivityFragment (extends android.support.v4.app.Fragment)
1 cái là activity còn một cái là fragment. Bạn lên trang chủ tiềm hiểu nhé. Mình nghĩ cái này khá là cơ bản ấy.

T.Lộc viết 19:45 ngày 30/09/2018

mới học thì chỉ code trên MainActivityFragment

Anh Đạt nói ngược rồi Đụng đến Fragment khá khó cho người mới bắt đầu.
Tạm thời mình gọi MainActivity.java với MainActivityFragment.javaActivity thường và Fragment còn cái tên trên kia thì chỉ là tên file java thôi.
Activity thường: tạo đơn giao diện, mỗi Activity có 1 giao diện duy nhất. Thường là file xml trong thư mục layout
Fragment:
Sử dụng Fragment để tạo giao diện tùy ý và tạo đa giao diện như giao diện dành cho tablet, điện thoại theo chiều đứng, điện thoại để chiều ngang, tạo menu…

Xử lý trên Fragment khác Activity thường là phần Context.
Ví dụ như trong Activity thường: Toast.makeText(this,"Hello",Toast.LENGTH_LONG).show();
Trên Fragment: Toast.makeText(getActivity(),"Hello",Toast.LENGTH_LONG).show();
Mình hình dung ra nhưng viết ra thành câu làm khó hiểu nên ghi ngắn gọn thế thôi

Ninh Lê viết 19:34 ngày 30/09/2018

Ví dụ như trong Activity thường: Toast.makeText(this,“Hello”,Toast.LENGTH_LONG).show();Trên Fragment: Toast.makeText(getActivity(),“Hello”,Toast.LENGTH_LONG).show();

Vậy với những câu lệnh như Toast phía trên thì mình nên viết trong MainActivity hay mainActivityFragment ?

Ninh Lê viết 19:34 ngày 30/09/2018

Anh Đạt nói ngược rồi Đụng đến Fragment khá khó cho người mới bắt đầu.

Em thấy mấy tutorial toàn hướng dẫn dùng fragment đấy thôi

T.Lộc viết 19:36 ngày 30/09/2018

Thích viết ở đâu cũng được, chú ý phần Context thôi. là phần khác nhau chỗ 2 cái đó. this với getActivity() . Mình thấy ở trường hay sai chỗ này ngồi mò riết mới ra. hì hì

T.Lộc viết 19:37 ngày 30/09/2018

Hướng dẫn từ những bài đầu tiên hả? Nếu thế chắc do 2 trường hợp là tutorial đó hướng dẫn Eclipse bản Juno cũ, do bản đó khi fragment mới đưa vào, lúc tạo project là nó luôn có 2 file main và Fragment nên người ta hướng dẫn luôn.
Trường hợp là tutorial mới thì do nhu cầu xã hội cần cái đó nhiều hoặc do người lập trình cảm thấy Fragment dễ
Mình học toàn bắt đầu bằng Activity thường, hiểu được cái đó sau này đưa Fragment vào dễ hiểu hơn (Theo mình thôi).

Mai Anh Dũng viết 19:35 ngày 30/09/2018

Ừ, Đạt học từ course của Udacity, Ví dụ đầu tiên là đã làm trên Fragment rồi. Chắc là style mới chăng?

Itachi Citus viết 19:43 ngày 30/09/2018

Activity là một thành phần có thể chạy độc lập, giống như form trên windows, còn fragment chỉ có thể chạy bên trên một activity khác, nó gần giống custom control trong winform vậy á, nhưng cách hoạt động nó hơi khác. Activity nó bao bên ngoài [các] fragment khác.

Mai Anh Dũng viết 19:30 ngày 30/09/2018

À, @Itachi_Citus giải thích như thế này giống như Đạt nghĩ này. Để tối về lên trang chủ đọc thêm.

T.Lộc viết 19:41 ngày 30/09/2018

Chắc là style mới chăng?

Có nhẽ thế, em học từ Android 4.3 rồi, vừa lướt qua mấy trang học Android thì mới thấy mình lạc hậu quá rồi

Quân viết 19:45 ngày 30/09/2018

MainActivity và MainActivityFragment là cái tên mình đặt thôi, quan trọng nó có kế thừa từ cái nào không ấy.
Như bạn bên trên nói khá dễ hiểu.
Thường thì MainActivity sẽ kế thừa từ Activity, ActionbarActivity (túm lại là Activity) thì nó giống JFrame trong java swing.

MainActivityFragment thường kế thừa từ Fragmnet, nó giống như các JPanel có thể nhét vào JFrame.

Một bạn nữa bên trên có nói về sự khác nhau giữa cách sử dụng Toast, thật sự thì không có gì khác nhau, chỉ cần hiểu rõ bản chất của Toast gồm 3 đối số Context, String, int.
Activity cũng là một context nên có thể dùng đối số đầu tiên là this.
Còn Fragment thì không phải context nên cần getActivity để lấy context.

Mai Anh Dũng viết 19:39 ngày 30/09/2018

@nguyenvanquan7826 quote lại các câu trả lời khác cho dễ hiểu. Em phân tích thêm được không? Nghe thú vị, anh muốn nghe thêm về trường hợp Toast em nói ở trên.

thật sự thì không có gì khác nhau, chỉ cần hiểu rõ bản chất của Toast gồm 3 đối số Context, String, int.

Cụ thể như thế nào Quân?

Quân viết 19:37 ngày 30/09/2018

Thì lệnh để tạo ra 1 ToastToast.makeText(Context,String,int).show();
Cái đối số đầu tiên là Context đó anh. Vì activity cũng là 1 context nên khi làm trong activity ta có thể dùng this tại đây:

Toast.makeText(this,"Hello",Toast.LENGTH_LONG).show();

Nhưng trong Fragment thì nó không phải Context nhưng có hàm getActivity để lấy Activity chứa Fragment (chứa nó) ấy.

Không phải cách sử dụng Toast ở Activity và Fragmnet khác nhau. Nó chỉ là 1 hàm để tạo Toast (thông báo nhanh), nó có thể được gọi ở bất kỳ đâu cũng được miễn là có đủ dữ liệu (có 3 đối số đó)

Mai Anh Dũng viết 19:46 ngày 30/09/2018

Hay, cảm ơn @nguyenvanquan7826 nhé. Anh sẽ học thêm

T.Lộc viết 19:38 ngày 30/09/2018

Một bạn nữa bên trên có nói về sự khác nhau giữa cách sử dụng Toast, thật sự thì không có gì khác nhau, chỉ cần hiểu rõ bản chất của Toast gồm 3 đối số Context, String, int.

Hì hì. Mình không ý nói Toast khác nhau. Chỉ lấy ví dụ Toast ra để dễ hiểu hơn trong cách sử dụng những thuộc tính có đối số Context thôi.

Ví dụ như trong Activity thường: Toast.makeText(this,“Hello”,Toast.LENGTH_LONG).show();Trên Fragment: Toast.makeText(getActivity(),“Hello”,Toast.LENGTH_LONG).show();

Nên là Toast.makeText(getApplicationContext(),"Hello",Toast.LENGTH_LONG).show();

Lí do: Tránh memory leak.

T.Lộc viết 19:46 ngày 30/09/2018

Lí do: Tránh memory leak.

Giải thích thêm giúp mình với.

Toast khi được add vào view thì vòng đời của nó được gắn liền với application chứ không được gắn với cả activity.

Trong android có hai nhóm context là:

  • Application Context
  • getApplication(): Lấy thẳng ra application.
  • getApplicationContext(): Lấy ra context nằm trong application.
  • Activity Context
  • getBaseContext()
  • Activity.this

Tương ứng với mỗi một nhóm context sẽ là một chu kì sống khác nhau của Context class.

Khi truyền context của activity và Toast và cho Toast hiện lên. Toast là một static không phụ thuộc vào Activity khi hiện lên nó sẽ sống và được dismiss đi auto dựa theo thông số về thời gian của nó. Bằng chứng là khi activity bị destroy thì Toast vẫn đứng nguyên. (Khác với dialog sẽ mất theo cùng activty)

Khi Activity bị chết nhưng Toast còn sống sẽ dẫn đến việc nó keep lại context trong bảng GC tree. Nếu truyền vào là activity context thì cũng chính là truyền vào activity thôi (Activity extends Context).
=> Nó keep lại activity trong GC tree.

Activity phải keep view trong nó (View của activity là composition với activity)
=> Nó keep lại view trong GC tree.

View trong android là phần tử nặng nhất trong ứng dụng. Theo như mô tả của Google Developer Romain Guy thì việc lồng view sâu 5 lần thôi đã không nên rồi (Máy 2.3 không render nổi luông) Vậy mà còn keep nó lại nữa thì chẳng mấy mà đều heep.

P/s: Mặc dù thời gian hiển thị toast chỉ ngắn ngủi thôi nhưng đừng coi thường. Mình từng nếm trái đắng khi tạo hai màn hình hiển thị buzz phức tạp ngang với màn hình new feed của Facebook. Khi người dùng tải về toàn bộ ảnh hiển thị trên màn hình toàn bitmap rồi dùng 1 chức năng gây lỗi phải chuyển về màn hình trước đó cũng toàn bitmap và alehấp.
=> Crash app do OutOfMemoryException trên máy 2.3 Sony Ericsson Xperia.

T.Lộc viết 19:44 ngày 30/09/2018

Cám ơn nhiều nha. Giờ mới biết, do chưa gặp trường hợp này bao giờ

việc lồng view sâu 5 lần

cái này em từng bị. Đau cả đầu tìm hoài mới ra. Toàn màn hình đen thui

À. Nếu được, khi nào anh rảnh có thể viết 1 bài về việc tối ưu bộ nhớ cho RAM trong lập trình cho Android được không, chủ đề giống bình luận ở trên đó. Do em thấy có nhiều ứng dụng chức năng giống nhau nhưng cái thì tốn nhiều RAM, cái tốn ít RAM trong quá trình sử dụng. Em tìm hoài ít ai chia sẻ về vấn đề này lắm. Em nghĩ anh làm nhiều nên sẽ có kinh nghiệm về cái này. hì hì.

Bài liên quan
0