2013-01-04 39 views
5

Tôi có một ViewPager với 4 tab.Phân đoạn được tạo lại khi tab thay đổi với ViewPager

Tôi đang sử dụng bộ điều hợp tùy chỉnh mở rộng FragmentPagerAdapter.

Vấn đề là khi tôi thay đổi tab, Fragment đầu tiên được tạo lại mặc dù nó không phải là hiển thị hiện tại. Hơn nữa, điều này chỉ xảy ra sau khi thay đổi tab lần thứ tư. Ví dụ. tab1 -> tab2 -> tab3 =>onStop từ tab1 được gọi. -> tab2 =>onCreateView từ tab1 được gọi (onAttach không được gọi).

Tôi muốn tránh điều này. Tôi cần tất cả các tab để luôn ở trạng thái của họ ngay cả khi chúng hiện không được hiển thị. Tôi có thể làm như thế nào?

Trả lời

20

Nó dễ dàng như sử dụng phương pháp setOffscreenPageLimit() từ ViewPager. Thông tin

thêm: http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

+0

Cảm ơn mahn, tôi đã làm cho mã của tôi cuối cùng hoạt động! Tôi đã tìm cách để có được ví dụ đã lưu, nhưng điều này 1 LOC làm cho mã của tôi làm việc xD –

+0

Đơn giản và cảm ơn bạn! – neobie

+0

Cảm ơn. Nó giải quyết vấn đề của tôi –

0

Khi bạn tạo nhanh đoạn, hãy gọi setRetainInstance(true). Điều này sẽ giữ nguyên trạng thái thể hiện của đoạn. onCreateView sẽ vẫn được gọi và bạn sẽ cần đảm bảo rằng bạn đang sử dụng trạng thái đã lưu và chỉ hiển thị chế độ xem mà không tải lại bất kỳ dữ liệu nào, ví dụ: bằng cách sử dụng boolean để thể hiện nếu đoạn của bạn đã được khởi tạo.

Bạn sẽ làm một cái gì đó như thế này:

public static class MyAdapter extends FragmentPagerAdapter { 
     @Override 
     public Fragment getItem(int position) { 
       MyFragment myFragment = new MyFragment(); 
       myFragment.setRetainInstance(true); 
       return myFragment; 
     } 
} 

class MyFragment extends Fragment { 
     . 
     . 
     . 

     boolean initialized = false; 
     ArrayList<MyData> myData = null; 

     void onCreate(...) { 
       if (initialized) { 
         renderViews(); 
       } else { 
         initialized = true; 
         loadData(); 
         renderViews(); 
       } 
     } 
} 

Bạn không cần phải thực hiện onSaveInstanceState(). Nó sẽ được xử lý tự động.

+0

Tôi không hiểu hành vi này .. Tại sao nó tạo ra một lần nữa sau khi bị ngừng nếu nó không phải là ngay cả những ai hiển thị? Tuy nhiên, tôi đang cố gắng làm theo cách tiếp cận của bạn, nhưng tôi không thể tìm ra cách để lưu trạng thái. Tôi đã thêm 'setRetainInstance (true)' vào 'onCreateView()' từ 'Fragment' nhưng' onSaveInstanceState() 'không bao giờ được gọi. – sergi

+0

Nó được gọi một lần nữa bởi vì nó tạo ra một mảnh bên trái và bên phải của chế độ xem hiện tại để nó có thể hiển thị nó với hình động trượt. Xem bản chỉnh sửa của tôi để biết thêm chi tiết. –

+0

nó rõ ràng hơn bây giờ, nhưng tôi không làm bất cứ điều gì với các quan điểm trong 'onCreate()' nhưng trong 'onCreateView()' mà cần phải trả về một 'View' mà sẽ phải được sửa đổi để phù hợp với trạng thái trước đó. Trong thực tế, khi tôi sử dụng 'myFragment.setRetainInstance (true);' the 'onCreateView()' hoặc 'onCreate()' không được gọi khi trước đây. – sergi

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