我的fragmentClass在medod onContextItemSelected中从ViewPager获取错误的页面

时间:2016-06-11 16:52:27

标签: java android android-viewpager contextmenu

首先。抱歉我的英文。

我将活动类与ViewPager作为字段和 Fragment类。我的活动是片段的主持人。在Fragment中我想调用为ImageView注册的上下文菜单。为此,我重写了2个方法:onCreateContextMenu和onContextItemSelected。

问题是:

  • 当调用onCreateContextMenu时,我得到了正确的页面(那个 现在在屏幕上。)
  • 但是当调用onContextItemSelected时,我会得到另一个页面(这个 取决于设置的参数 ViewPager.setOffscreenPageLimit(INT))。例如,如果设置为3,则返回的页面将是那些位于屏幕上当前位置左侧或右侧3个位置的页面。

我该如何解决?

谢谢。

活动代码

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;
            }
        }
    }
}

和片段代码

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);
    }
}

1 个答案:

答案 0 :(得分:0)

ViewPager.setOffscreenPageLimit(int);

这将准备左右两侧(邻居)的页面。

默认情况下为1。

因此,在您的情况下,获取viewPager创建的当前片段。

您可以通过覆盖带位置的viewPager的 instantiateItem() destroyItem()回调,在 SparseArray 中创建片段。

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);
}

在想要获取当前片段的位置,通过传递位置使用getFragment()方法获取它。