2014-04-10 20 views
6

Tôi dường như đang gặp sự cố khi cập nhật các đoạn mà tôi đang sử dụng trong ViewPager của mình, bất kể tôi thử inCreate(), onCreateView() hoặc onResume(). Dưới đây là cách tôi đang thiết lập ViewPager tôi trong MainFragment tôi:ViewPager Các mảnh vỡ không được khởi tạo trong onCreate

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_main_screen, container, false); 

     mPager = (ViewPager)rootView.findViewById(R.id.pager); 
     mPager.setOffscreenPageLimit(2); // So all 3 pages are loaded at once. 
     mAdapter = new JournalPagerAdapter(getActivity().getSupportFragmentManager(), this); 
     mPager.setAdapter(mAdapter); 

     // Add bar graph to view 
     mGraphLayout = (LinearLayout) rootView.findViewById(R.id.journalGraph); 
     updateGraph(); 
     mGraphLayout.addView(mGraphView); 

     mPainFrag = (PainFragment)mAdapter.getRegisteredFragment(0); 
     // Null pointer here, but if I put the action in a button listener, it works. 
     mPainFrag.setScale(mEntry.getPain()); 
... 

tôi truy cập vào các mảnh vỡ thông qua một số phương pháp ghi đè trong FragmentPagerAdapter tôi:

public class JournalPagerAdapter extends FragmentPagerAdapter { 

    SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>(); 
    private View.OnClickListener mOnClickListener; 


    public JournalPagerAdapter(FragmentManager mgr, View.OnClickListener onClickListener) { 
     super(mgr); 
     mOnClickListener = onClickListener; 
    } 
    @Override 
    public Fragment getItem(int pos) { 
     switch(pos) { 

      case 0: return PainFragment.newInstance("PainFragment", mOnClickListener); 
      case 1: return StressFragment.newInstance("StressFragment", mOnClickListener); 
      case 2: return SleepFragment.newInstance("SleepFragment", mOnClickListener); 
      default: return PainFragment.newInstance("PainFragment", mOnClickListener); 
     } 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 

    /* Thanks to Streets of Boston (http://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-a-viewpager) 
    */ 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Log.v("rx", "itemInstantiated"); 
     Fragment fragment = (Fragment) super.instantiateItem(container, position); 
     registeredFragments.put(position, fragment); 
     return fragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     registeredFragments.remove(position); 
     super.destroyItem(container, position, object); 
    } 

    public Fragment getRegisteredFragment(int position) { 
     return registeredFragments.get(position); 
    } 

tôi dường như không thể tìm ra tại sao phân đoạn là null ngay sau khi tôi đặt bộ điều hợp, nhưng nếu tôi đặt mã cập nhật phân đoạn trong một sự kiện nhấp chuột, tôi không có vấn đề gì.

+0

Bạn đã cố gắng tạo một Runnable để dành thời gian cho ui tạo ViewPager? – Fllo

+0

Tôi nghĩ về điều đó trong thử nghiệm ban đầu của mình, nhưng tôi muốn sử dụng một runnable như là một phương sách cuối cùng. Tôi không nghĩ rằng tôi đang làm bất cứ điều gì trong số bình thường ở đây, nó âm thanh hợp lý rằng sẽ có một cách để thông báo cho các mảnh máy chủ của FragmentPagerAdapter được khởi tạo đầy đủ. – jwBurnside

+0

Tôi không nghĩ rằng bạn có sự lựa chọn bởi vì bạn chọn mảnh với mAdapter.getRegisteredFragment (và nó là một phương pháp bên trong từ bộ điều hợp của bạn). Sau đó, tôi nghĩ bạn phải chờ bộ điều hợp. – Fllo

Trả lời

6

Tôi sẽ thử thêm trình xử lý bố cục vào ViewPager của bạn để được thông báo khi quá trình đặt chế độ xem đã xảy ra.

Khi bạn tạo cuộc gọi ViewPager mPager.getViewTreeObserver().addOnGlobalLayoutListener() và chuyển nội dung nào đó triển khai OnGlobalLayoutListener.

Trong phương thức gọi lại, hãy cập nhật phân đoạn của bạn. Đảm bảo gọi số mPager.getViewTreeObserver().removeGlobalOnLayoutListener(this) trong cuộc gọi lại, nếu không cuộc gọi lại sẽ được gọi nhiều lần.

+0

Bạn là một vị cứu tinh ... –

0

Bạn có thể khởi tạo các đoạn của mình trong hàm tạo của PagerAdapter và chỉ cần trả lại getItem thay vì khởi tạo chúng.

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