Ý nghĩa của addToBackStack với tham số null là gì?


94

Tôi có một mã khách hàng. Chỉ có một hoạt động cho tất cả các phân đoạn tức là một hoạt động duy nhất đang quản lý tất cả các phân đoạn.

Hoạt động này chứa đoạn mã sau cho bất kỳ đoạn nào ở cuối phương thức của đoạn đó-

Ví dụ - phân mảnh MoreFragment:

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

Vì thế,

1) Ý nghĩa của addToBackStack(null)theo sau bởi a là commit()gì?

2) Tại sao bạn cần truyền tham số null cho addToBackStack?

3) Làm thế nào để lấy đoạn đó sau khi được thêm vào như thế này?

Có vẻ như mã này vô dụng vì tôi đã chạy mã mà không có dòng cuối cùng .addToBackStack(null).commit()và nó chạy mà không gặp bất kỳ sự cố nào.


developer.android.com/reference/android/app/… trong một số trường hợp, bạn phải gọi phương thức đó.
Lucifer


3
Bạn có thể chuyển tên phân mảnh làm tham số cho addToBackStack (tên) thay vì Null. Nếu bạn vượt qua Null thì bạn sẽ không thể sử dụng phương thức FragmentManager.popBackStackIm Instant (String name, int flags); hoặc popBackStack (Tên chuỗi, cờ int); bởi vì tên là Null. Vì vậy, các phương thức popBackstack sẽ không hoạt động. Tôi khuyên bạn nên chuyển tên Fragment dưới dạng các tham số thay vì chuyển null.
luckylukein

Câu trả lời:


112

Ý nghĩa của addToBackStack (null) theo sau bởi một commit () là gì?

Trích dẫn tài liệu:

Bằng cách gọi addToBackStack (), giao dịch thay thế được lưu vào ngăn xếp phía sau để người dùng có thể đảo ngược giao dịch và khôi phục lại phân đoạn trước đó bằng cách nhấn nút Quay lại.

Nếu bạn thêm nhiều thay đổi vào giao dịch (chẳng hạn như thêm () hoặc xóa ()) khác và gọi addToBackStack (), thì tất cả các thay đổi được áp dụng trước khi bạn gọi commit () sẽ được thêm vào ngăn xếp phía sau dưới dạng một giao dịch duy nhất và nút Quay lại sẽ đảo ngược tất cả chúng với nhau.

Thứ tự mà bạn thêm các thay đổi vào FragmentTransaction không quan trọng, ngoại trừ:

Bạn phải gọi commit()sau cùng. Nếu bạn đang thêm nhiều phân đoạn vào cùng một vùng chứa, thì thứ tự bạn thêm chúng sẽ xác định thứ tự chúng xuất hiện trong phân cấp chế độ xem.

Vì vậy, bạn phải cam kết cuối cùng.

Tại sao bạn cần truyền tham số null cho addToBackStack?

Nó không cần phải là null, nó có thể là một chuỗi. Nếu bạn không muốn, chỉ cần vượt qua null.

public trừu tượng FragmentTransaction addToBackStack (Tên chuỗi)

Đã thêm vào API cấp 11 Thêm giao dịch này vào ngăn xếp phía sau. Điều này có nghĩa là giao dịch sẽ được ghi nhớ sau khi nó được cam kết và sẽ đảo ngược hoạt động của nó khi sau đó bật ra khỏi ngăn xếp.

Tên tham số Một tên tùy chọn cho trạng thái ngăn xếp phía sau này, hoặc null.

Liên quan đến:

Có vẻ như mã này vô dụng vì tôi đã chạy mã mà không có dòng cuối cùng .addToBackStack (null) .commit () và nó chạy mà không gặp bất kỳ sự cố nào

Nếu bạn muốn điều hướng đến phân đoạn trước đó, hãy thêm nó vào backstack. Vì vậy, nó phụ thuộc vào việc bạn có muốn thêm phân mảnh vào backstack hay không.

Làm thế nào để có được đoạn đó sau khi được thêm vào như thế này?

Bạn đã có cá thể phân mảnh firstFragment. Vì vậy, tôi không biết ý bạn là gì khi lấy mảnh vỡ sau này.

Thêm thông tin @

http://developer.android.com/guide/components/fragment.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)


Bạn cũng có thể thêm điều này vào câu trả lời của mình từ tài liệu API: Thêm giao dịch này vào ngăn xếp phía sau. Điều này có nghĩa là giao dịch sẽ được ghi nhớ sau khi nó được cam kết và sẽ đảo ngược hoạt động của nó khi sau đó bật ra khỏi ngăn xếp. Tên tham số Một tên tùy chọn cho trạng thái ngăn xếp phía sau này, hoặc null.
Dyrborg

Vì vậy, như tôi đã hiểu, toàn bộ mục đích của việc thêm vào backstack là để thực hiện điều hướng như chúng ta làm với nút quay lại để chuyển đến đoạn trước?
Chúa tôi,

ok, vậy nếu bạn đang truyền một tham số cho addToBackStack thì tại sao chúng ta cần phải làm gì getFragmentManager().popBackStackImmediate()nếu nút quay lại có thể tự làm việc đó với / không có truyền tham số? Xem câu trả lời của - stackoverflow.com/questions/21156153/…
Chúa ơi,

@VedPrakash bạn không cần phải có. Ngoài ra đó là một câu hỏi và câu trả lời khác nhau hoàn toàn. Bạn có thể dễ dàng tìm ra cho mình bằng việc có hai mảnh thêm chúng vào lại ngăn xếp và nhấn nút quay lại
Raghunandan

@VedPrakash đọc cách quản lý các mảnh @ developer.android.com/guide/components/fra
mảnh.html

17

Các tagchuỗi trong addToBackStack(String name)đưa ra một cách để xác định vị trí các ngăn xếp lại cho sau này bật trực tiếp đến vị trí đó. Nó có nghĩa là được sử dụng trong phương pháp popToBackStack(String name, int flags):

Bật quá trình chuyển đổi phân đoạn cuối cùng từ ngăn xếp lại phân đoạn của người quản lý. Hàm này không đồng bộ - nó xếp hàng đợi yêu cầu bật lên, nhưng hành động sẽ không được thực hiện cho đến khi ứng dụng quay trở lại vòng lặp sự kiện của nó.

name: Nếu khác rỗng, đây là tên của trạng thái quay lại trước đó cần tìm; nếu được tìm thấy, tất cả các trạng thái cho đến trạng thái đó sẽ được hiển thị. Cờ POP_BACK_STACK_INCLUSIVE có thể được sử dụng để kiểm soát xem bản thân trạng thái đã đặt tên có được bật lên hay không. Nếu null, chỉ trạng thái trên cùng được hiển thị.

cờ: 0 hoặc POP_BACK_STACK_INCLUSIVE.

Nói cách khác, nó sẽ bật ngăn xếp phía sau của bạn cho đến khi tìm thấy đoạn được thêm vào bởi bên nametrong addToBackStack(String name).

Ví dụ: nếu bạn thực hiện một loạt các bổ sung hoặc thay thế cho trình quản lý phân đoạn với các tên "frag1", "frag2", "frag3", "frag4" và sau đó muốn quay lại trực tiếp phân đoạn 2 được thêm bằng addToBackStack (" frag2 "), bạn gọi popToBackStack("frag2", 0).

Vì thế,

  • Sử dụng .addToBackStack("fragName"): nếu bạn muốn sau này popToBackStack(String name, int flags)bật nhiều hơn một ngăn xếp trở lại.

  • Sử dụng .addToBackStack(null): Nếu sau này bạn không muốn bật nhiều ngăn xếp trở lại nhưng vẫn muốn bật từng ngăn xếp một. Làm điều này ngay cả khi bạn sẽ không gọi popToBackStack () một cách rõ ràng mà thay vào đó sẽ để việc triển khai mặc định back press xử lý back stack.

  • Sử dụng .disallowAddToBackStack(): Nếu bạn không muốn nhấn back hoặc gọi popBackStack () nó một cách rõ ràng. Nó sẽ đảm bảo không có phần nào của mã đang sử dụng .addToBackStack ().


1

Câu trả lời của bạn không được chấp nhận. Nếu bạn không muốn thêm các đoạn vào ngăn xếp trở lại, bạn nên sử dụng đoạn mã dưới đây:

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

Dưới đây bạn có ví dụ dễ thương về cách sử dụng nó:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);

6
Không được chấp nhận ở đâu? Tôi không thấy bất kỳ thứ gì trong tài liệu hoặc nguồn FragmentTransaction.
Rup

3
Hãy cẩn thận, nếu bạn disallowAddToBackStack, thì Bất kỳ lệnh gọi nào trong tương lai tới addToBackStack sẽ ném IllegalStateException. Nếu addToBackStack đã được gọi, phương thức này sẽ ném IllegalStateException.
Kathir
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.