Trong thời gian chạy,
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
0 có thể thêm, xoá, thay thế và thực hiện các thao tác khác với các mảnh [fragment] để phản hồi khi người dùng tương tác. Mỗi tập hợp thay đổi mảnh mà bạn xác nhận [commit] được gọi là một giao dịch [transaction] và bạn có thể chỉ định việc cần làm bên trong giao dịch bằng cách sử dụng các API mà lớp
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1 cung cấp. Bạn có thể nhóm nhiều hành động [action] thành một giao dịch duy nhất, ví dụ: một giao dịch có thể thêm hoặc thay thế nhiều mảnh. Thao tác nhóm này có thể hữu ích khi bạn hiển thị nhiều mảnh đồng cấp trên cùng một màn hình, chẳng hạn như với chế độ xem phân tách.
Bạn có thể lưu từng giao dịch vào ngăn xếp lui do
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
0 quản lý, cho phép người dùng di chuyển trở lại thông qua các thay đổi mảnh – tương tự như việc di chuyển ngược qua các hoạt động.
Bạn có thể nhận bản sao của
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1 từ
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
0 bằng cách gọi
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
5, như trong ví dụ sau:
Kotlin
val fragmentManager = ... val fragmentTransaction = fragmentManager.beginTransaction[]
Java
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
Lệnh gọi cuối cùng trên mỗi
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1 phải xác nhận giao dịch. Lệnh gọi
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
7 báo hiệu cho
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
0 rằng tất cả thao tác [operation] đã được thêm vào giao dịch.
Kotlin
val fragmentManager = ... // The fragment-ktx module provides a commit block that automatically // calls beginTransaction and commit for you. fragmentManager.commit {
// Add operations here
}Java
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[]; // Add operations here fragmentTransaction.commit[];
Cho phép sắp xếp lại các thay đổi về trạng thái mảnh
Mỗi
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1 sẽ sử dụng
val fragmentManager = ... // The fragment-ktx module provides a commit block that automatically // calls beginTransaction and commit for you. fragmentManager.commit {
// Add operations here
}0:
Kotlin
supportFragmentManager.commit {
...
setReorderingAllowed[true]
}Java
FragmentManager fragmentManager = ... fragmentManager.beginTransaction[]
...
.setReorderingAllowed[true]
.commit[];
Để tương thích với hành vi, cờ sắp xếp lại không được bật theo mặc định. Tuy nhiên, bạn cần phải cho phép FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
0 thực thi
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1 đúng cách, đặc biệt là khi ứng dụng này hoạt động trên ngăn xếp lui cũng như chạy ảnh động và hiệu ứng chuyển đổi. Việc bật cờ sẽ đảm bảo rằng nếu nhiều giao dịch được thực hiện cùng nhau, thì mọi mảnh trung gian [tức là các giao dịch được thêm vào và thay thế ngay lập tức] sẽ không trải qua các thay đổi trong vòng đời hoặc ảnh động/hiệu ứng chuyển tiếp sẽ được thực thi. Lưu ý rằng cờ này ảnh hưởng đến cả quá trình thực hiện giao dịch ban đầu lẫn việc đảo ngược giao dịch bằng
val fragmentManager = ... // The fragment-ktx module provides a commit block that automatically // calls beginTransaction and commit for you. fragmentManager.commit {
// Add operations here
}3.
Thêm và xoá mảnh
Để thêm một mảnh vào
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
0, hãy gọi trên giao dịch. Phương thức này sẽ nhận được mã nhận dạng của vùng chứa [container] cho mảnh, cũng như tên lớp của mảnh bạn muốn thêm. Mảnh đã thêm sẽ được chuyển sang trạng thái
val fragmentManager = ... // The fragment-ktx module provides a commit block that automatically // calls beginTransaction and commit for you. fragmentManager.commit {
// Add operations here
}6. Chúng tôi rất khuyến khích việc vùng chứa là một
val fragmentManager = ... // The fragment-ktx module provides a commit block that automatically // calls beginTransaction and commit for you. fragmentManager.commit {
// Add operations here
}7 – một phần của hệ phân cấp thành phần hiển thị.
Để xoá một mảnh khỏi máy chủ lưu trữ, hãy gọi , truyền vào thực thể mảnh được truy xuất từ trình quản lý mảnh thông qua
val fragmentManager = ... // The fragment-ktx module provides a commit block that automatically // calls beginTransaction and commit for you. fragmentManager.commit {
// Add operations here
}9 hoặc
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[]; // Add operations here fragmentTransaction.commit[];
0. Nếu thành phần hiển thị của mảnh trước đây đã được thêm vào vùng chứa, thì thành phần hiển thị đó sẽ bị xoá khỏi vùng chứa tại thời điểm này. Mảnh bị xoá sẽ được chuyển sang trạng thái
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[]; // Add operations here fragmentTransaction.commit[];
1.
Hãy sử dụng để thay thế một mảnh hiện có trong vùng chứa bằng một thực thể của lớp mảnh mới mà bạn cung cấp. Việc gọi
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[]; // Add operations here fragmentTransaction.commit[];
2 tương đương với việc gọi
val fragmentManager = ... // The fragment-ktx module provides a commit block that automatically // calls beginTransaction and commit for you. fragmentManager.commit {
// Add operations here
}8 bằng một mảnh trong vùng chứa và thêm một mảnh mới vào chính vùng chứa đó.
Đoạn mã sau đây cho biết cách bạn có thể thay thế một mảnh bằng một mảnh khác:
Kotlin
// Create new fragment val fragmentManager = // ... // Create and commit a new transaction fragmentManager.commit {
setReorderingAllowed[true]
// Replace whatever is in the fragment_container view with this fragment
replace[R.id.fragment_container]
}Java
// Create new fragment and transaction FragmentManager fragmentManager = ... FragmentTransaction transaction = fragmentManager.beginTransaction[]; transaction.setReorderingAllowed[true]; // Replace whatever is in the fragment_container view with this fragment transaction.replace[R.id.fragment_container, ExampleFragment.class, null]; // Commit the transaction transaction.commit[];
Trong ví dụ này, một bản sao mới của
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[]; // Add operations here fragmentTransaction.commit[];
5 thay thế mảnh [nếu có] hiện có trong vùng chứa bố cục được xác định bởi
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[]; // Add operations here fragmentTransaction.commit[];
6.
Theo mặc định, các thay đổi đã thực hiện trong
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1 sẽ không được thêm vào ngăn xếp lui. Để lưu các thay đổi đó, bạn có thể gọi trên
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1. Để biết thêm thông tin, hãy xem Trình quản lý mảnh.
Xác nhận [commit] không đồng bộ
Việc gọi sẽ không thực hiện giao dịch ngay lập tức. Thay vào đó, giao dịch được lên lịch để chạy trên chuỗi giao diện người dùng chính ngay khi có thể thực hiện. Tuy nhiên, nếu cần, bạn có thể gọi để chạy giao dịch mảnh trên luồng giao diện người dùng [UI thread] ngay lập tức.
Xin lưu ý rằng
supportFragmentManager.commit {
...
setReorderingAllowed[true]
}2 không tương thích với
supportFragmentManager.commit {
...
setReorderingAllowed[true]
}3. Ngoài ra, bạn có thể thực thi tất cả
supportFragmentManager.commit {
...
setReorderingAllowed[true]
}4 đang chờ xử lý do các lệnh gọi chưa chạy gửi bằng cách gọi . Phương pháp này tương thích với
supportFragmentManager.commit {
...
setReorderingAllowed[true]
}3.
Đối với phần lớn trường hợp sử dụng, bạn chỉ cần duy nhất
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
7.
Thứ tự hoạt động rất quan trọng
Thứ tự bạn thực hiện các thao tác trong
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1 là rất quan trọng, đặc biệt là khi sử dụng
FragmentManager fragmentManager = ... fragmentManager.beginTransaction[]
...
.setReorderingAllowed[true]
.commit[];
0. Phương thức này áp dụng ảnh động nhất định cho tất cả thao tác mảnh theo sau.Kotlin
supportFragmentManager.commit {
setCustomAnimations[enter1, exit1, popEnter1, popExit1]
add[R.id.container] // gets the first animations
setCustomAnimations[enter2, exit2, popEnter2, popExit2]
add[R.id.container] // gets the second animations
}Java
getSupportFragmentManager[].beginTransaction[]
.setCustomAnimations[enter1, exit1, popEnter1, popExit1]
.add[R.id.container, ExampleFragment.class, null] // gets the first animations
.setCustomAnimations[enter2, exit2, popEnter2, popExit2]
.add[R.id.container, ExampleFragment.class, null] // gets the second animations
.commit[]
Giới hạn vòng đời của mảnh
supportFragmentManager.commit {
...
setReorderingAllowed[true]
}4 có thể ảnh hưởng đến trạng thái vòng đời của các mảnh riêng lẻ được thêm trong phạm vi giao dịch. Khi tạo
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1, sẽ đặt trạng thái tối đa cho mảnh đã cho. Ví dụ:
FragmentManager fragmentManager = ... fragmentManager.beginTransaction[]
...
.setReorderingAllowed[true]
.commit[];
4 sử dụng FragmentManager fragmentManager = ... fragmentManager.beginTransaction[]
...
.setReorderingAllowed[true]
.commit[];
3 để giới hạn các mảnh ngoài màn hình ở trạng thái FragmentManager fragmentManager = ... fragmentManager.beginTransaction[]
...
.setReorderingAllowed[true]
.commit[];
6.Hiện và ẩn thành phần hiển thị của mảnh
Sử dụng các phương thức
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1, và để hiện và ẩn thành phần hiển thị của các mảnh đã được thêm vào vùng chứa. Các phương thức này thiết lập chế độ hiển thị của các thành phần hiển thị của mảnh mà không ảnh hưởng đến vòng đời của mảnh.
Mặc dù bạn không cần phải sử dụng giao dịch mảnh để chuyển đổi chế độ hiển thị của các thành phần hiển thị trong một mảnh, nhưng các phương pháp này hữu ích đối với trường hợp bạn muốn thay đổi trạng thái hiển thị liên kết với các giao dịch trong ngăn xếp lui.
Đính kèm và tách rời mảnh
Phương thức
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1 sẽ tách rời mảnh khỏi giao diện người dùng và huỷ bỏ thứ bậc của hệ phân cấp thành phần hiển thị. Mảnh này còn nguyên trạng thái [
// Create new fragment val fragmentManager = // ... // Create and commit a new transaction fragmentManager.commit {
setReorderingAllowed[true]
// Replace whatever is in the fragment_container view with this fragment
replace[R.id.fragment_container]
}- như khi được đặt vào ngăn xếp lui. Tức là mảnh đã bị xoá khỏi giao diện người dùng nhưng vẫn do trình quản lý mảnh quản lý.
Phương thức sẽ đính kèm lại một đoạn trước đó từng bị tách rời ra. Điều này khiến hệ phân cấp thành phần hiển thị được tạo lại, đính kèm với giao diện người dùng và hiển thị.
Vì
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
1 được coi là một tập hợp các thao tác atom đơn, nên các lệnh gọi đến
// Create new fragment val fragmentManager = // ... // Create and commit a new transaction fragmentManager.commit {
setReorderingAllowed[true]
// Replace whatever is in the fragment_container view with this fragment
replace[R.id.fragment_container]
}5 và
// Create new fragment val fragmentManager = // ... // Create and commit a new transaction fragmentManager.commit {
setReorderingAllowed[true]
// Replace whatever is in the fragment_container view with this fragment
replace[R.id.fragment_container]
}6 trên cùng một thực thể mảnh trong cùng một giao dịch sẽ huỷ liên kết với nhau một cách triệt để, do đó, tránh việc phá huỷ và tái tạo ngay lập tức trên giao diện người dùng của mảnh. Hãy sử dụng các giao dịch riêng biệt, phân tách nhau bằng
// Create new fragment val fragmentManager = // ... // Create and commit a new transaction fragmentManager.commit {
setReorderingAllowed[true]
// Replace whatever is in the fragment_container view with this fragment
replace[R.id.fragment_container]
}7 khi sử dụng
FragmentManager fragmentManager = ... FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction[];
7, nếu bạn muốn tách rời rồi sau đó đính kèm lại một mảnh.