首先。对不起我的英语。
我有一个 Activity 类,其中 ViewPager 作为字段,还有一个 Fragment 类。我的 Activity 是 fragment 的宿主。在 Fragment 中,我想调用为 ImageView 注册的上下文菜单。为此,我重写了 2 个方法:onCreateContextMenu 和 onContextItemSelected。
问题是:
- 当 onCreateContextMenu 被调用时,我得到了正确的页面(即 现在在屏幕上)。
- 但是当 onContextItemSelected 被调用时我得到另一个页面(这个 取决于设置的参数 ViewPager.setOffscreenPageLimit(int))。例如,如果设置为3,则返回的页面将为屏幕当前位置向左或向右3个位置的页面。
如何修复它?
谢谢。
Activity 代码
public class CrimePagerActivity extends FragmentActivity {
private ViewPager mViewPager;
private ArrayList<Crime> mCrimes;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mViewPager = new ViewPager(this);
mViewPager.setId(R.id.viewPager);
setContentView(mViewPager);
mCrimes = CrimeLab.get(this).getCrimes();
mViewPager.setOffscreenPageLimit(4);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
mViewPager.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES);
}
FragmentManager fm = getSupportFragmentManager();
mViewPager.setAdapter(new FragmentStatePagerAdapter(fm) {
@Override
public Fragment getItem(int position) {
Crime crime = mCrimes.get(position);
return CrimeFragment.newInstance(crime.getId());
}
@Override
public int getCount() {
return mCrimes.size();
}
});
UUID crimeId = (UUID) getIntent().getSerializableExtra(CrimeFragment.EXTRA_CRIME_ID);
for (int i = 0; i< mCrimes.size(); i++){
if (mCrimes.get(i).getId().equals(crimeId)){
mViewPager.setCurrentItem(i);
break;
}
}
}
}
和 fragment 代码
public class CrimeFragment extends Fragment {
.......
private ImageView mPhotoView;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
........
View v = inflater.inflate(R.layout.fragment_crime, container, false);
mPhotoView = (ImageView) v.findViewById(R.id.crime_imageView);
registerForContextMenu(mPhotoView);
return v;
}
.........
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
Log.i(TAG, mCrime.getTitle());
switch (v.getId()) {
case R.id.crime_imageView:
if (mCrime.getPhoto() != null)
getActivity().getMenuInflater().inflate(R.menu.crime_photo_context, menu);
break;
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
Log.i(TAG, mCrime.getTitle());
switch (item.getItemId()) {
case R.id.menu_item_delete_photo:
getActivity().deleteFile(mCrime.getPhoto().getFilename());
PictureUtils.cleanImageView(mPhotoView);
mCrime.setPhoto(null);
return true;
}
return super.onContextItemSelected(item);
}
}
最佳答案
ViewPager.setOffscreenPageLimit(int);
这将准备左右两侧(相邻)的页面。
默认为 1。
因此,在您的情况下,获取 viewPager 创建的当前 fragment 。
您可以在 SparseArray 中创建 fragment 时,通过覆盖 viewPager 的 instantiateItem() 和 destroyItem() 回调以及位置来存储 fragment 。
private SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
@Override
public Object instantiateItem(ViewGroup container, int position) {
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 getFragment(int position) {
return registeredFragments.get(position);
}
而你想要获取当前fragment的地方,通过传递位置使用getFragment()方法获取。
关于java - 我的fragmentClass在medod onContextItemSelected中从ViewPager获取错误的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37766269/