Hướng dẫn làm cửa lùa Transactional

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]
}

  1. 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ị.

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.

Chủ Đề