我的问题是最初直接加载片段,我想调用方法片段对用户可见。
要加载正确的片段,我在viewPager.setCurrentItem()
中使用onCreate
。效果很好。
FragmentActivity code
:
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mTabsAdapter = new TabsPlayerAdapter(this, mRadioList);
mMainViewPager.setAdapter(mTabsAdapter);
mMainViewPager.setOnPageChangeListener(this);
mMainViewPager.setCurrentItem(2);
}
对于一个名为fragment Current的方法,我使用onPageSelected viewPager
。效果很好。
FragmentActivity code
:
@Override
public void onPageSelected(int position) {
Log.d(TAG, "onPageSelected - position: " + position);
((PlayerFragment) mTabsAdapter.mSparseFragment.get(position))
.startAnnimation();
}
FragmentStatePagerAdapter code:
@Override
public Fragment getItem(final int position) {
Log.d(TAG, "getItem - position: " + position);
Bundle args = new Bundle();
args.putString("num", mRadioModel.get(position).name);
mSparseFragment.put(position, Fragment.instantiate
(mContext,PlayerFragment.class.getName(), args));
return mSparseFragment.get(position);
}
FragmentStatePagerAdapter code :
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
Log.d(TAG, "destroyItem - position: " + position);
mSparseFragment.remove(position);
}
我可以分开做这两件事。但是当我尝试将两者结合使用时,当我调用"NullPointerException"
时,我有一个fragment
我看到在onPageSelected
getItem
Adapter
之前调用了{{1}}。
答案 0 :(得分:2)
非常容易解决:
在适配器中写:
public static interface FirstShot
{
public void onFirstShot();
}
private FirstShot firstShot;
private boolean shot = false;
@Override
public Fragment getItem(int arg0)
{
if (!shot && firstShot != null)
{
shot = true;
firstShot.onFirstShot();
}
// your code here
}
现在在活动中实施FirstShot:
@Override
public void onFirstShot()
{
viewPager.post(new Runnable()
{
@Override
public void run()
{
boolean needNotify = false;
if (pager.getCurrentItem() == position) needNotify = true;
viewPager.setCurrentItem(position, false);
if (needNotify) onPageSelected(position);
}
});
}
onPageSelected()现在调用!
答案 1 :(得分:1)
当调用onAttachedToWindow时,您将知道项目可用。在您调用setCurrentItem时,尚未使用适配器创建视图。 (setAdapter不足以知道所有都被夸大了)
否则,您可以考虑在设置currentItem后设置侦听器,因此在打开片段时没有动画。
答案 2 :(得分:0)
已接受的解决方案对我没有用,因为我在getItem创建它之前仍然调用onPageSelected。
我这样修好了:
public class MyAdapter extends FragmentPagerAdapter {
...
...
@Override
public Fragment getItem(int position) {
Fragment fragment = createdFragments.get(position);
if (fragment != null) {
return fragment;
}
fragment = createNewFragment();
createdFragments.put(position, fragment);
return fragment;
}
public TabFragment getFragment(int position) {
TabFragment fragment = createdFragments.get(position);
if (fragment == null) {
fragment = (TabFragment) getItem(position);
}
return fragment;
}
}
然后我使用adapter.getFragment()
按代码获取片段,永远不会得到空值。