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ì.
Bạn đã cố gắng tạo một Runnable để dành thời gian cho ui tạo ViewPager? – Fllo
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
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