无论我是在 onCreate()、onCreateView() 还是 onResume() 中尝试,我似乎在更新我在 ViewPager 中使用的 fragment 时遇到问题。以下是我在 MainFragment 中设置 ViewPager 的方式:
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());
...
我正在通过我的 FragmentPagerAdapter 中的一些重写方法访问 fragment :
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);
}
我似乎无法弄清楚为什么在设置适配器后 fragment 立即为空,但是如果我将 fragment 更新代码放在单击事件中,我就没有问题。
最佳答案
我会尝试向您的 ViewPager 添加一个布局监听器,以便在发生 View 布局时收到通知。
当您创建 ViewPager 时调用 mPager.getViewTreeObserver().addOnGlobalLayoutListener()
并传递实现 OnGlobalLayoutListener
的内容。
在回调方法中,进行 fragment 更新。确保在回调中调用mPager.getViewTreeObserver().removeGlobalOnLayoutListener(this)
,否则回调会被多次调用。
关于android - ViewPager Fragments 未在 onCreate 中启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22997205/