Tạo mảnh

Một mảnh đại diện cho một phần mô-đun của giao diện người dùng trong một hoạt động. Một mảnh có vòng đời riêng, nhận các sự kiện đầu vào riêng và bạn có thể thêm hoặc xoá mảnh trong khi hoạt động chứa mảnh đang chạy.

Tài liệu này mô tả cách tạo một mảnh và đưa mảnh vào hoạt động.

Thiết lập môi trường

Các mảnh cần có phần phụ thuộc trên thư viện AndroidX Fragment. Bạn cần thêm kho lưu trữ Google Maven vào tệp settings.gradle của dự án để đưa phần phụ thuộc này vào.

Groovy

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        ...
    }
}

Kotlin

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        ...
    }
}

Để đưa thư viện AndroidX Fragment vào dự án, hãy thêm các phần phụ thuộc sau vào tệp build.gradle của ứng dụng:

Groovy

dependencies {
    def fragment_version = "1.5.5"

    // Java language implementation
    implementation "androidx.fragment:fragment:$fragment_version"
    // Kotlin
    implementation "androidx.fragment:fragment-ktx:$fragment_version"
}

Kotlin

dependencies {
    val fragment_version = "1.5.5"

    // Java language implementation
    implementation("androidx.fragment:fragment:$fragment_version")
    // Kotlin
    implementation("androidx.fragment:fragment-ktx:$fragment_version")
}

Tạo một lớp mảnh

Để tạo một mảnh, hãy mở rộng lớp AndroidXFragment và ghi đè phương thức để chèn logic của ứng dụng vào, tương tự như cách bạn tạo một lớp Activity. Để tạo một mảnh tối thiểu nhằm xác định bố cục riêng, hãy cung cấp tài nguyên bố cục của mảnh cho hàm khởi tạo cơ sở như trong ví dụ sau:

Kotlin

class ExampleFragment : Fragment(R.layout.example_fragment)

Java

class ExampleFragment extends Fragment {
    public ExampleFragment() {
        super(R.layout.example_fragment);
    }
}

Thư viện mảnh còn cung cấp các lớp cơ sở mảnh chuyên biệt hơn:

DialogFragment
Hiển thị hộp thoại nổi. Sử dụng lớp này để tạo hộp thoại là một giải pháp thay thế hay cho việc sử dụng các phương thức trợ giúp hộp thoại trong lớp Activity, vì các mảnh tự động xử lý việc tạo và dọn dẹp Dialog. Xem phần Hiển thị hộp thoại có DialogFragment để biết thêm thông tin chi tiết.
PreferenceFragmentCompat
Hiển thị một hệ phân cấp các đối tượng Preference dưới dạng danh sách. Bạn có thể sử dụng PreferenceFragmentCompat để tạo màn hình cài đặt cho ứng dụng.

Thêm một mảnh vào hoạt động

Thông thường, mảnh của bạn phải được nhúng trong AndroidX FragmentActivity để thành một phần giao diện người dùng trong bố cục của hoạt động đó. FragmentActivity là lớp cơ sở của AppCompatActivity, vì thế nếu đã phân lớp con AppCompatActivity để cung cấp khả năng tương thích ngược trong ứng dụng, thì bạn không cần thay đổi lớp cơ sở của hoạt động nữa.

Bạn có thể thêm mảnh vào hệ phân cấp khung hiển thị của hoạt động bằng cách xác định mảnh hoặc vùng chứa mảnh trong tệp bố cục của hoạt động, sau đó thêm mảnh theo cách lập trình từ bên trong hoạt động. Trong cả hai trường hợp, bạn cần thêm FragmentContainerView để xác định vị trí nên đặt mảnh trong hệ phân cấp khung hiển thị của hoạt động. Khuyến khích luôn sử dụng FragmentContainerView làm vùng chứa mảnh, vì FragmentContainerView bao gồm bản sửa lỗi dành riêng cho các mảnh mà những nhóm khung hiển thị khác như FrameLayout không cung cấp.

Thêm mảnh qua XML

Để tuyên bố thêm một mảnh vào XML của bố cục hoạt động, hãy sử dụng một phần tử FragmentContainerView.

Dưới đây là ví dụ về bố cục hoạt động chứa một FragmentContainerView:

<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.example.ExampleFragment" />

Thuộc tính android:name chỉ định tên lớp của Fragment để tạo thực thể. Khi bố cục của hoạt động được tăng cường, mảnh chỉ định sẽ được tạo thực thể, onInflate() được gọi trên mảnh mới tạo thực thể đó và một FragmentTransaction được tạo để thêm mảnh vào FragmentManager.

Thêm một mảnh theo phương thức lập trình.

Để thêm một mảnh vào bố cục của hoạt động theo phương thức lập trình, bố cục đó phải bao gồm FragmentContainerView phân phát dưới dạng vùng chứa mảnh như trong ví dụ sau:

<!-- res/layout/example_activity.xml -->
<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Không giống như phương thức XML, thuộc tính android:name không được sử dụng trên FragmentContainerView tại đây, do đó không có mảnh cụ thể nào được tự động tạo thực thể. Thay vào đó, FragmentTransaction sẽ được dùng để tạo thực thể cho một mảnh và thêm nó vào bố cục của hoạt động.

Trong khi hoạt động đang chạy, bạn có thể thực hiện các giao dịch đối với mảnh như thêm, xoá hoặc thay thế mảnh. Trong FragmentActivity, bạn có thể nhận một thực thể của FragmentManager. Bạn có thể dùng thực thể này để tạo FragmentTransaction. Sau đó, bạn có thể tạo thực thể cho mảnh trong phương thức onCreate() của hoạt động bằng cách sử dụng FragmentTransaction.add(), chuyển mã nhận dạng ViewGroup của vùng chứa trong bố cục và lớp mảnh bạn muốn thêm rồi xác nhận giao dịch như minh hoạ trong ví dụ sau:

Kotlin

class ExampleActivity : AppCompatActivity(R.layout.example_activity) {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (savedInstanceState == null) {
            supportFragmentManager.commit {
                setReorderingAllowed(true)
                add<ExampleFragment>(R.id.fragment_container_view)
            }
        }
    }
}

Java

public class ExampleActivity extends AppCompatActivity {
    public ExampleActivity() {
        super(R.layout.example_activity);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .setReorderingAllowed(true)
                .add(R.id.fragment_container_view, ExampleFragment.class, null)
                .commit();
        }
    }
}

Trong ví dụ trước, lưu ý rằng giao dịch đối với mảnh chỉ được tạo khi savedInstanceStatenull. Việc này nhằm đảm bảo chỉ thêm mảnh một lần duy nhất khi tạo hoạt động lần đầu tiên. Khi có thay đổi về cấu hình và hoạt động đó được tạo lại, savedInstanceState không còn là null và không cần phải thêm mảnh lần nữa vì tự mảnh đã khôi phục từ savedInstanceState.

Nếu mảnh của bạn yêu cầu một vài dữ liệu ban đầu, các đối số sẽ được chuyển đến mảnh bằng cách cung cấp Bundle trong lệnh gọi đến FragmentTransaction.add() như hiển thị dưới đây:

Kotlin

class ExampleActivity : AppCompatActivity(R.layout.example_activity) {
      override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if (savedInstanceState == null) {
            val bundle = bundleOf("some_int" to 0)
            supportFragmentManager.commit {
                setReorderingAllowed(true)
                add<ExampleFragment>(R.id.fragment_container_view, args = bundle)
            }
        }
    }
}

Java

public class ExampleActivity extends AppCompatActivity {
    public ExampleActivity() {
        super(R.layout.example_activity);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState == null) {
            Bundle bundle = new Bundle();
            bundle.putInt("some_int", 0);

            getSupportFragmentManager().beginTransaction()
                .setReorderingAllowed(true)
                .add(R.id.fragment_container_view, ExampleFragment.class, bundle)
                .commit();
        }
    }
}

Các đối số Bundle sau đó có thể được truy xuất từ bên trong mảnh bằng cách gọi requireArguments() và các phương thức getter Bundle thích hợp có thể được sử dụng để truy xuất từng đối số.

Kotlin

class ExampleFragment : Fragment(R.layout.example_fragment) {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val someInt = requireArguments().getInt("some_int")
        ...
    }
}

Java

class ExampleFragment extends Fragment {
    public ExampleFragment() {
        super(R.layout.example_fragment);
    }

    @Override
    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        int someInt = requireArguments().getInt("some_int");
        ...
    }
}

Xem thêm

Giao dịch đối với mảnh và FragmentManager được đề cập chi tiết hơn trong Hướng dẫn về trình quản lý mảnh.