Nếu bạn đang đọc bài viết này thì chắc chắn bạn là 1 dev Android và đã từng làm việc với Fragment
hay FrameLayout
rồi nhỉ. Nếu như bạn chưa sử dụng đến thằng FragmentContainerView
thì bạn cũng dùng FrameLayout
để tương tác với các Fragment
rồi.
Trước đây, ta sử dụng FrameLayout
để chứa các Fragment
, nhưng sau này FragmentContainerView
là View được Android đề xuất sử dụng thay thế cho FrameLayout
.
Hai điểm chính mà FragmentContainerView đã cải thiện so với FrameLayout
- Các transaction của fragment được thực hiện khá dễ dàng như với FrameLayout. Bây giờ nó được xử lý bởi FragmentContainerView, nơi mà các fragment đang đi vào (entering) container sẽ nằm dưới các fragment đang đi ra (exiting) khỏi container cho đến khi nó hoàn toàn ra khỏi ngoài màn hình.
- Trước đây với FrameLayout, khi ta custom animation của các fragment với enter animation hoặc exit animation sẽ gặp vấn đề về thứ tự Z-index của các fragment, có lỗi UI/UX khi chạy transaction giữa các fragment.
FragmentContainerView là gì?
- Nó là View được google đề xuất để chứa các Fragment.
- Nó kế thừa từ FrameLayout, thêm các tính năng bổ sung.
- Nếu thêm bất kỳ một View nào khác trong FragmentContainerView ngoài Fragment sẽ throw ngay IllegalStateException.
- Thường được set trong xml layout của Activity.
Dùng FragmentContainerView
- Có thể thực hiện thêm fragment vào container được dynamic như thông thường với code vì nó kế thừa từ FrameLayout
supportFragmentManager.beginTransaction().add(R.id.fragmentContainer, OneFragment::class.java,null).commit()
- Không dùng FragmentContainerView để thay thế các ViewGroup như FrameLayout, LinearLayout v.v
- FragmentContainerView chỉ cho phép thêm các View được trả về bởi hàm
onCreateView()
của Fragment, nếu không sẽ dẫn đếnIllegalStateException
- Custom animation các fragment trong FragmentContainerView:
<actionandroid:id="@+id/action_oneFragment_to_twoFragment"app:enterAnim="@android:anim/slide_in_left"app:exitAnim="@android:anim/slide_in_left"app:destination="@id/twoFragment"/>
Các thuộc tính của FragmentContainerView
<androidx.fragment.app.FragmentContainerViewandroid:id="@+id/fragmentContainerView"android:layout_width="match_parent"android:layout_height="match_parent"android:name="androidx.navigation.fragment.NavHostFragment"app:defaultNavHost="true"app:navGraph="@navigation/nav_home"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"/>
android:name
: Tên class của việc implementNavHost
.app:navGraph
: Liên kết với một navigation graph – chỉ định các destination mà user có thể điều hướng đến.app:defaultNavHost="true"
: Đảm bảo choNavHostFragment
sẽ bắt chặn để xử lý nút Back của hệ thống. Chỉ có duy nhất mộtNavHost
được đặt default.
Kết luận
FragmentContainerView là View được google đề xuất để chứa và quản lý các fragment, nên mình cứ thế mà dùng thôi
Bài viết được dịch từ:
Nguồn: viblo.asia