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

标签 java android android-viewpager contextmenu

首先。对不起我的英语。

我有一个 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/

相关文章:

java - 为什么 Calendar 类没有公共(public)构造函数?

java - GAE应用程序开发: NullPointerException when returning a hashmap

java - 每个月的平均客户支出和每个月的订购商品数量

java - Settings gradle、property gradle 和 build gradle 之间的区别

Android:使用 viewPager 限制 fragment 加载

android - 如何在 TabHost/ViewPager 父 fragment 中恢复子 fragment

java - 未能停止 Tomcat 中的 Elasticsearch 线程

android - native 库(.so 文件)未添加到 android 项目

java - 访问另一个类的微调器时出现 NullPointerException

android - 处理 PagerTitleStrip click in compatibiliy Fragment-based ViewPager