Android Fragment: Khi nào sử dụng ẩn / hiện hoặc thêm / xóa / thay thế?


117

Giả sử tôi muốn thay thế phân đoạn hiện tại trong một số chế độ xem vùng chứa bằng một phân đoạn khác. Tốt hơn là sử dụng thay thế ...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

... hoặc sau đây, với hiển thị và ẩn?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

Có một cách để làm điều này hiệu quả hơn không? Không thể tìm thấy nhiều thông tin về thời điểm sử dụng các phương pháp này hoặc cách chúng ảnh hưởng đến vòng đời của các đoạn liên quan. Cảm ơn!


nếu tôi đi đến phân đoạn B từ phân đoạn A và sau đó quay lại phân đoạn A làm thế nào tôi có thể đảm bảo rằng sự kiện vòng đời chẳng hạn như onCreateView không được gọi trên phân đoạn A? tìm phân đoạn theo thẻ có hoạt động không?
blackHawk

Câu trả lời:


135

Bạn nên xem xét những gì bạn định làm với mảnh vỡ để quyết định con đường đi theo. Nếu bạn sử dụng FragmentTransaction để ẩn phân mảnh, thì nó vẫn có thể ở trạng thái đang chạy trong vòng đời của nó, nhưng giao diện người dùng của nó đã bị tách khỏi cửa sổ nên không còn hiển thị nữa. Vì vậy, về mặt kỹ thuật, bạn vẫn có thể tương tác với phân đoạn và gắn lại giao diện người dùng của nó sau này bạn cần. Nếu bạn thay thế phân mảnh, tức là bạn đang thực sự kéo nó ra khỏi vùng chứa và nó sẽ trải qua tất cả các sự kiện xé nhỏ trong vòng đời (onPause, onStop, v.v.) và nếu vì lý do nào đó bạn cần lại mảnh đó, bạn sẽ phải chèn nó trở lại vùng chứa và để nó chạy lại tất cả quá trình khởi tạo.

Nếu có khả năng cao là bạn sẽ cần lại phân đoạn đó, thì chỉ cần ẩn nó đi vì đây là một thao tác ít tốn kém hơn để vẽ lại bố cục của nó hơn là khởi động lại hoàn toàn nó.


5
Đối với nhu cầu của chúng tôi, việc khởi tạo phân mảnh khá tốn kém, vì vậy chúng tôi có thể sẽ sử dụng hide()show()để tiết kiệm điều đó! Cảm ơn vì điều đó!
Robert Karl

2
Xin chào, khi bạn nói tách khỏi cửa sổ, bạn có nghĩa là lệnh gọi lại onDetach () sẽ được gọi? Tôi đã thử nghiệm điều đó, có vẻ như nó không phải là trường hợp.
GingerJim

có lẽ ý anh ấy là "tách ra"; một đoạn cũng có thể được tách ra / gắn lại (bổ sung thêm / loại bỏ, show / hide)
comeGetSome

1
@Zainodis, tôi cũng gặp vấn đề tương tự. Giải pháp của tôi là lưu trạng thái ẩn của phân đoạn trong onSaveInstanceState () - saveInstanceState.putBoolean (STATE_HIDDEN, isHidden ()); sau đó trong onCreate () if (saveInstanceState! = null) lấy lại trạng thái ẩn và nếu phân đoạn bị ẩn thì hãy ẩn nó bằng giao dịch.
worawee.s

1
@ worawee.s Xin chào và cảm ơn vì đã cập nhật :)! Tôi đã giải quyết vấn đề một thời gian trước đây - tôi không thực sự cần ẩn / hiện, v.v. vì vậy tôi đã hoàn toàn bỏ nó và bây giờ tôi đang sử dụng các tiêu chuẩn như thêm / thay thế hoặc các hoạt động phân đoạn đơn trong ngăn đơn (về cơ bản quy trình chi tiết tổng thể) . Đối với những người vẫn sử dụng ẩn, giải pháp của bạn sẽ thực sự hữu ích - và việc không kiểm tra saveInstance! = Null là một trong những sai lầm tôi đã mắc phải trước đây.
AgentKnopf

5

Cơ bản là bạn đã tự trả lời. Nếu bạn muốn thay thế (vì vậy phân đoạn cũ không còn cần thiết nữa) hãy sử dụng replace()nếu bạn muốn tạm thời ẩn nó rồi thực hiện hide().


Về cơ bản thay thế không removeAll. Tôi không thể tìm thấy hideAll phù hợp :(
AlikElzin-kilaka

@ AlikElzin-kilaka Trong hoạt động 3 mảnh của tôi trong cả ba đoạn tôi lấy dữ liệu từ mạng mà phương pháp tôi nên làm theo
Mansukh Ahir

0

Tôi đã sử dụng phương thức ẩn / hiện trong hoạt động của mình với 4 đoạn mã của nó đã giải quyết được giải pháp của tôi nhưng đôi khi ngẫu nhiên khi tôi hiển thị hộp thoại của mình, nó đưa ra ngoại lệ mã thông báo lỗi cửa sổ khi tôi sử dụng phương thức thêm và thay thế thì ngoại lệ mã thông báo xấu không xảy ra vì vậy tôi nghĩ show / phương pháp ẩn không hoàn hảo

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.