jwB*_*ide 7 android android-fragments android-viewpager
无论我是否尝试使用onCreate(),onCreateView()或onResume(),我似乎都在更新我在ViewPager中使用的片段时出现问题.以下是我在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());
...
Run Code Online (Sandbox Code Playgroud)
我通过FragmentPagerAdapter中的一些重写方法访问片段:
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);
}
Run Code Online (Sandbox Code Playgroud)
在设置适配器后,我似乎无法弄清楚为什么片段为空,但如果我将片段更新代码放在click事件中,我就没有问题.
小智 7
我会尝试向ViewPager添加一个布局监听器,以便在发生视图布局时收到通知.
当您创建ViewPager调用mPager.getViewTreeObserver().addOnGlobalLayoutListener()并传递实现的内容时OnGlobalLayoutListener.
在回调方法中,进行片段更新.确保调用mPager.getViewTreeObserver().removeGlobalOnLayoutListener(this)回调,否则将多次调用回调.
| 归档时间: |
|
| 查看次数: |
1350 次 |
| 最近记录: |