2012-10-31 27 views
91

Giả sử tôi muốn thay thế đoạn hiện tại trong một số chế độ xem vùng chứa bằng một chế độ xem vùng chứa khác. Sử dụng thay thế có tốt hơn không ...Android Fragments: Khi nào nên sử dụng ẩn/hiện hoặc thêm/xóa/thay thế?

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

... hoặc sau đây, có hiển thị và ẩn không?

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

Một cách để làm điều này hiệu quả hơn? 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!

Trả lời

108

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

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

+3

Đối với nhu cầu của chúng tôi, việc khởi tạo phân đoạn là khá tốn kém, vì vậy chúng tôi sẽ có thể đi với 'hide()' và 'show()' để lưu trên đó! Cảm ơn vì điều này! –

+2

Xin chào, khi bạn nói tách ra khỏi cửa sổ, bạn có nghĩa là callback onDetach() sẽ được gọi? Tôi đã thử nghiệm, có vẻ như – GingerJim

+0

có lẽ ông có nghĩa là "tách", một mảnh cũng có thể được tách ra/gắn lại (bổ sung thêm/xóa, hiển thị/ẩn) – comeGetSome

5

Bạn về cơ bản đã tự trả lời. Nếu bạn muốn thay thế (vì vậy mảnh cũ không còn cần thiết) sử dụng replace() nếu bạn muốn tạm thời ẩn nó sau đó làm hide().

+0

Về cơ bản, thay thế sẽ xóa tất cả. Tôi không thể tìm thấy nội dung phù hợp hideAll :( –

+0

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

Các vấn đề liên quan