2012-11-07 26 views
18

Tôi có một ViewPager với một FragmentPagerAdapter, và ứng dụng của tôi trước đây chỉ sử dụng hai mảnh (loại khác nhau) mà không có vấn đề gì.Làm thế nào để tôi nói với FragmentPagerAdapter tùy chỉnh của tôi để ngừng phá hủy các mảnh của tôi?

Tôi vừa thêm một đoạn thứ ba, tuy nhiên, và bộ tiếp hợp/viewpager của tôi dường như đang phá hủy các đoạn của tôi khi tôi ở xa chúng. Ví dụ: nếu tôi đang ở trang 1, trang 3 bị hủy và được tạo lại khi tôi đến gần trang đó. Nếu tôi ở trang 3, điều tương tự cũng xảy ra với trang 1.

Điều này đang gây ra nhiều sự cố trong ứng dụng của tôi. Các mảnh không phải là rất nhiều RAM-nặng cả, vì vậy làm thế nào tôi có thể ngăn chặn điều này xảy ra?

+0

Có phá hủy Fragment hoặc phá hủy View? – DeeV

+0

Tôi không chắc chắn. Tôi sẽ kiểm tra bằng cách nào? –

+1

Bạn vừa nói "nó gây ra rất nhiều vấn đề." Nếu Fragment đang bị hủy, thì trạng thái của nó đang bị xóa khỏi bộ nhớ và đặt lại về mặc định khi được nạp lại. – DeeV

Trả lời

43

Tôi tin rằng bạn đang tìm kiếm ViewPager.setOffscreenPageLimit().

Trong trường hợp của bạn, phần sau sẽ giữ các mảnh của bạn trong bộ nhớ và không phá hủy chúng.

ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
pager.setOffscreenPageLimit(2); 

Tuy nhiên, tôi nghi ngờ bạn không lưu trữ chính xác trạng thái chế độ xem khi bị hủy. Các mảnh của bạn nên xử lý đúng cách bị phá hủy/tái tạo. Ví dụ, các mảnh vỡ của bạn cũng sẽ bị phá hủy và tái tạo nếu thay đổi định hướng xảy ra. Nó cũng có thể xảy ra nếu người dùng rời khỏi ứng dụng của bạn và hệ thống sau đó cần bộ nhớ và phá hủy Hoạt động của bạn. Nó sẽ có thể mở lại và ở trong trạng thái giống như trước. Nếu đây thực sự là vấn đề với bạn, hãy cân nhắc lưu trạng thái trong onSaveInstanceState(). Trạng thái đã lưu sẽ được hiển thị cho bạn trong onCreate nơi bạn có thể khởi tạo trạng thái của phân đoạn giống với trạng thái bị phá hủy.

+0

Hoàn hảo! Đây sẽ là giải pháp tạm thời của tôi cho đến khi tôi làm cho các mảnh của mình độc lập với mạng hơn. –

+0

điều này đã giúp tôi rất nhiều! cảm ơn! – JozeRi

+1

onSaveInstanceState() không được gọi là hầu hết các lần. Ví dụ: bạn đang ở trang 1, di chuyển đến trang 5: đoạn đầu tiên đi qua onDestroyView(), ví dụ, nhưng không phải là onSaveInstanceState(). Trong trường hợp của tôi ít nhất. – natario

4

chỉ ghi đè phương pháp này trong FragmentpagerAdapter

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
     // TODO Auto-generated method stub 
     super.destroyItem(ViewGroup container, int position, Object object); 
} 

loại bỏ super.destroyItem(ViewGroup container, int position, Object object);

từ mã của bạn

+0

Điều này sẽ làm việc miễn là bạn _never_ muốn Fragment của bạn bị phá hủy (ngay cả khi FragmentPagerAdapter nằm ngoài phạm vi). Điều này có thể có vấn đề, nhưng trong một số trường hợp, nó hoàn hảo. Đối với những tình huống vấn đề đó, bạn luôn có thể gọi 'destroyItem (..)' một mình. –

+0

Cảm ơn bạn rất nhiều vì giải pháp này :) –

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