36

Tôi đã chuyển một phần Ứng dụng của mình từ Hoạt động thành Phân đoạn để tôi có thể sử dụng các tab ActionBar gọn gàng.OnCreateView được gọi nhiều lần/Làm việc với ActionBar và Fragments

Tuy nhiên, sau khi hoàn thành quá trình chuyển đổi, tôi gặp sự cố: bất cứ khi nào tôi chuyển sang tab khác, phân đoạn đó sẽ được tạo lại. Cả onCreate và onCreateView đều được gọi mỗi khi tôi tới tab.

Tôi có 4 tab, mỗi trong số đó có nghĩa là để mở một trong các mảnh vỡ:

Fragment ShopFragment = new WebActivity(); 
Fragment SearchFragment = new SearchActivity(context); 
Fragment StoreFragment = new StoreLocatorActivity(context, this); 
Fragment BlogsFragment = new BlogsActivity(context, this); 

Dưới đây là mã của tôi cho người nghe:

class MyTabsListener implements ActionBar.TabListener { 
     public Fragment fragment; 

     public MyTabsListener(Fragment fragment) { 
      this.fragment = fragment; 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
      ft.hide(fragment); 
     } 

     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      ft.replace(R.id.fragment_container, fragment); 
     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) {   

     } 

    } 

Ai đó có thể xin vui lòng chỉ cho tôi ở bên phải phương hướng?

+0

Có ai biết cách tôi có thể xử lý việc này không? –

Trả lời

43

Khi bạn gọi FragmentTransaction.replace(...), Android sẽ thực hiện hiệu quả một chuỗi FragmentTransaction.remove(...) (đối với tất cả Phân đoạn hiện được thêm vào vùng chứa đó) và FragmentTransaction.add(...) (đối với Fragment được cung cấp của bạn). Xóa một Fragment khỏi FragmentManager sẽ làm cho Fragment bị phá hủy và trạng thái của nó sẽ không còn được quản lý nữa. Đáng chú ý nhất, khi bạn thêm lại Fragment, tất cả các khung nhìn sẽ được thiết lập lại. Lưu ý: vì bạn đang sử dụng lại cùng một cá thể Fragment, Fragment sẽ vẫn giữ giá trị bất kỳ biến cá thể nào.

Một giải pháp cho vấn đề này là sử dụng FragmentTransaction.detach(Fragment)FragmentTransaction.attach(Fragment) khi chuyển đổi. Điều này sẽ khiến cho các chế độ xem Fragment được tạo lại (onDestroyView() & onCreateView() sẽ được gọi), nhưng gói trạng thái cá thể sẽ được lưu và trả lại cho bạn giữa các cuộc gọi và do đó trạng thái xem có thể được duy trì. Đây là phương pháp được thực hiện bởi FragmentPagerAdapter khi nó cố chuyển đổi giữa các Phân đoạn.

Hoặc, bạn có thể cho phép Phân đoạn bị hủy, nhưng duy trì trạng thái đã lưu của chúng cho chúng một cách độc lập. Điều này sẽ sử dụng ít bộ nhớ hơn, với chi phí của một thời gian chuyển mạch chậm hơn. Các phương thức ghi chú sẽ là FragmentManager.saveFragmentInstanceState(Fragment)FragmentManager.setInitialSavedState(Fragment.SavedState), kết hợp với việc thêm/xóa. Đây là cách tiếp cận được thực hiện bởi FragmentStatePagerAdapter.

Bạn có thể xem source for FragmentPagerAdaptersource for FragmentStatePagerAdapter để biết các gợi ý triển khai.

+0

Đây là giải pháp thay thế. onCreate và onCreateView vẫn nhận được gọi và tiết kiệm yêu cầu nhiều công việc. Không có cách nào để giữ quan điểm đã vẽ của mảnh vụn và chỉ thay thế chúng? Tại sao lại sơn lại chúng? –

+1

Có tùy chọn ẩn. –

+0

Xin chào, tôi đang sử dụng các tab ActionBar và sử dụng tính năng đính kèm và tách! Bạn có thể vui lòng giải thích với một số mã mẫu làm thế nào tôi có thể lưu trạng thái dụ khi chuyển sang tab khác và sau đó duy trì trạng thái khi trở lại tab! Cảm ơn –

7

Có tùy chọn show/hide chỉ để các mảnh sẽ không cần phải được sơn lại/tái tạo và onCreate()onCreateView() sẽ không được thu hồi lại.

+2

Tìm thấy giải pháp ở đây: http://stackoverflow.com/a/11003859/435605 –