2013-09-05 16 views
11

Thực ra, tôi luôn tái sử dụng quan điểm của tôi trong mảnh vỡ của tôi như sau:Phân đoạn - tôi có nên sử dụng lại chế độ xem trong onCreateView không và tôi nên làm như thế nào?

private View mView = null; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    if (mView == null) 
     mView = inflater.inflate(R.layout.view); 
    return mView; 
} 

Đó làm việc, với ViewPager và vân vân. Bây giờ tôi bắt đầu sử dụng các mảnh vỡ của tôi trong các hoạt động đơn giản như tốt và nếu, và chỉ nếu, tôi thêm các đoạn đến backstack, điều này sẽ thất bại vì java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

Vì vậy, câu hỏi của tôi là:

  • Is it ok , nếu tôi kiểm tra xem cha mẹ, hãy xóa nó và thêm nó vào phụ huynh mới?
  • Hoặc tôi có nên luôn tạo lại chế độ xem và không bao giờ sử dụng lại không? Nếu đúng thì tại sao?
  • Có các điểm khác, việc sử dụng lại chế độ xem sẽ không thành công không?

Trả lời

11

Có thể điều này có thể giúp hiểu hành vi. Nếu bạn kiểm tra FragmentManagerImpl.java bạn sẽ tìm thấy những điều sau đây:

Đầu tiên chúng ta tạo ra một cái nhìn bằng cách gọi onCreateView() (dòng 845) và sau đó chúng tôi quấn cái nhìn tạo ra với cái nhìn khác, mà sẽ trở thành cha mẹ của quan điểm của chúng tôi (dòng 848 -849). Điều này có nghĩa là quan điểm của chúng ta không trở thành một đứa trẻ của container thực sự, nhưng bây giờ nó là một đứa trẻ của một khung nhìn wrapper. Sự cố khi sử dụng lại xảy ra, khi chế độ xem bị xóa khỏi vùng chứa (dòng 998). FragmentManager loại bỏ chế độ xem trình bao bọc từ vùng chứa, nhưng chế độ xem thực của chúng tôi vẫn được thêm vào chế độ xem trình bao bọc mẹ. Đây là những gì gây ra vấn đề bạn gặp phải.

Do đó, nếu bạn xóa chế độ xem khỏi bố mẹ, nó có thể hoạt động. Ngay cả khi biết điều này, tôi sẽ không khuyên bạn nên sử dụng lại lượt xem trong đoạn cũng bởi vì lượt xem có thể dài hơn một chút so với đoạn, vì chúng có thể được sử dụng trong hoạt ảnh "biến mất" ngay cả sau khi đoạn bị phá hủy. Nếu bạn cố gắng xóa chế độ xem đó khỏi chế độ xem của cha mẹ tại thời điểm đó, thì hoạt ảnh có thể bị hỏng.

Một đối số khác để không lưu vào bộ nhớ cache là Android không hỗ trợ chế độ xem tái chế theo từng phần theo thiết kế. Hãy nhớ ListAdapter cho phép sử dụng lại các chế độ xem? Android chăm sóc bộ nhớ đệm và sử dụng lại các chế độ xem đó một cách thích hợp. Đây không phải là trường hợp với mảnh vỡ mặc dù.

+0

Cảm ơn lời giải thích này, điều đó làm cho nó rõ ràng hơn với tôi – prom85

6

tôi đang tái sử dụng quan điểm với một cái gì đó như thế này:

if(view == null){ 
    view = (ViewGroup) inflater.inflate(R.layout.news_list, container, false); 
} else { 
    ((ViewGroup) view.getParent()).removeView(view); 
} 
return view; 

Tôi không biết nếu theo cách này là chính xác, nhưng có vẻ như để làm việc cho tôi ..

Chú ý: Tôi đang sử dụng aproach này bởi vì tôi có một listview trong một mảnh, và khi người dùng chạm vào một mục nó tải một mảnh mới (quản lý mảnh thay thế mảnh danh sách hiện tại bằng cách sử dụng). Sau đó, khi người dùng nhấn nút quay lại, vì tôi đang sử dụng lại chế độ xem cũ của đoạn đó (không bị hủy khi bị xóa bằng FM) thì người dùng tiếp tục xem danh sách ở vị trí trước khi mở xem chi tiết phân đoạn.

+0

Hi @edrain giải pháp của bạn hoạt động tốt nhưng nó không loại bỏ chế độ xem khỏi vùng chứa ngay cả khi tôi đã xuất hiện đoạn của mình. –

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