Tạo một phân đoạn

Một phân 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 xóa phân mảnh trong khi hoạt động đang chạy.

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

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

Các phân mảnh cần có phần phụ thuộc trênthư viện AndroidX Fragment. Bạn cần thêm kho lưu trữ Google Mavenvà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 phần phụ thuộc sau vào tệp build.gradle của ứng dụng:

Groovy

dependencies {
    def fragment_version = "1.5.1"

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

Kotlin

dependencies {
    val fragment_version = "1.5.1"

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

Tạo một lớp phân 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ạoActivity. Để 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 phân 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ở phân 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ớpActivity, 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ượngPreference 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 phân mảnh vào hoạt động

Thông thường, phân 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 đó. FragmentActivitylà lớp cơ sở củaAppCompatActivity, vì thế nếu đã phân lớp AppCompatActivity để cung cấp khả năng tương thích ngược trong ứng dụng, bạn không cần thay đổi lớp cơ sở hoạt động nữa.

Bạn có thể thêm phân mảnh vào hệ phân cấp chế độ xem của hoạt động bằng cách xác định mảnh hoặc vùng chứa phân mảnh trong tệp bố cục 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êmFragmentContainerViewđể xác định vị trí nên đặt phân mảnh trong hệ phân cấp chế độ xem của hoạt động. Khuyến khích luôn sử dụngFragmentContainerView 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 phân mảnh mà những nhóm chế độ xem 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ộtFragmentContainerView:

<!-- 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 bản sao. Khi bố cục của hoạt động được tăng cường, phân mảnh chỉ định sẽ được tạo bản sao,onInflate()được gọi trên phân mảnh mới tạo và một FragmentTransaction được tạo để thêm phân mảnh vào FragmentManager.

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

Để thêm một phân mảnh vào bố cục 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 phân 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ó phân mảnh cụ thể nào được tự động tạo. Thay vào đó, FragmentTransactionsẽ được dùng để tạo bản sao 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 phân mảnh như thêm, xóa hoặc thay thế mảnh. Trong FragmentActivity, bạn có thể nhận bản sao củaFragmentManager, những bản này có thể dùng để tạo FragmentTransaction. Sau đó có thể tạo phân mảnh trong phương thức onCreate() của hoạt động bằng cách sử dụngFragmentTransaction.add(), chuyển mã nhận dạng ViewGroup của vùng chứa trong bố cục và lớp phân mảnh bạn muốn thêm, sau đó xác nhận giao dịch như hiển thị 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 ý giao dịch phân mảnh chỉ được tạo khi savedInstanceStatenull. Việc này nhằm đảm bảo phân mảnh chỉ được thêm một lần duy nhất khi tạo hoạt động lần đầu tiên. Khi thay đổi cấu hình xảy ra và hoạt động được tạo lại,savedInstanceState không còn là null và phân mảnh không cần phải được thêm lần nữa vì tự nó đã khôi phục từ savedInstanceState.

Nếu phân 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 phâ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 phân mảnh bằng cách gọirequireArguments()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 mảnh và FragmentManager được đề cập chi tiết hơn trong Hướng dẫn về trình quản lý phân mảnh.