【问题标题】:My fragmentClass get wrong page from ViewPager in medod onContextItemSelected我的 fragmentClass 从 medod onContextItemSelected 中的 ViewPager 得到错误的页面
【发布时间】:2016-06-12 02:09:31
【问题描述】:

首先。对不起我的英语。

我有 Activity 类,其中 ViewPager 作为一个字段和一个 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);
    }
}

【问题讨论】:

  • 您应该使用 ViewPager.OnPageChangedListener,并调用当前 Fragment 以便在用户每次滑动到该 Fragment 时调用 registerForContextMenu()(从 onCreateView() 中删除调用)。有关此方法的示例,请参见此处:stackoverflow.com/a/36504458/4409409

标签: java android android-viewpager contextmenu


【解决方案1】:
ViewPager.setOffscreenPageLimit(int);

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

默认为 1。

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

您可以在创建时将片段存储在 SparseArray 中,方法是使用位置覆盖 viewPager 的 instantiateItem()destroyItem() 回调。

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()方法来获取。

【讨论】:

  • 我知道。问题是如何让 ViewPager 在我的 Fragment 类方法 onContextItemSelected() 中返回当前页面(不是邻居)
猜你喜欢
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多