Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的fragmentClass从medod onContextItemSelected中的ViewPager获取错误页面_Java_Android_Android Viewpager_Contextmenu - Fatal编程技术网

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

Java 我的fragmentClass从medod onContextItemSelected中的ViewPager获取错误页面,java,android,android-viewpager,contextmenu,Java,Android,Android Viewpager,Contextmenu,首先。对不起我的英语 我有一个活动类,其中ViewPager作为一个字段和一个片段类。我的活动是一个片段的宿主。在片段中,我想调用为ImageView注册的上下文菜单。为此,我覆盖了两个方法:onCreateContextMenu和onContextItemSelected 问题是: 当调用onCreateContextMenu时,我得到了正确的页面(即 现在在屏幕上) 但是当调用onContextItemSelected时,我会得到另一个页面(这是 取决于在中设置的参数 ViewPager.

首先。对不起我的英语

我有一个活动类,其中ViewPager作为一个字段和一个片段类。我的活动是一个片段的宿主。在片段中,我想调用为ImageView注册的上下文菜单。为此,我覆盖了两个方法: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;
            }
        }
    }
}
这将准备左右两侧的页面(相邻页面)

默认值为1

因此,在您的示例中,我们需要获取由viewPager创建的当前片段

SparseArray中创建片段时,您可以通过使用位置覆盖viewPager的实例化Item()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);
}
private SparseArray registeredFragments=new SparseArray();
@凌驾
公共对象实例化项(视图组容器,int位置){
Fragment Fragment=(Fragment)super.instanceItem(容器,位置);
注册碎片。放置(位置,碎片);
返回片段;
}
@凌驾
公共项(视图组容器、int位置、对象){
注册碎片。移除(位置);
超级项目(容器、位置、对象);
}
公共片段getFragment(int位置){
返回registeredFragments.get(位置);
}
在要获取当前片段的位置,使用getFragment()方法通过传递位置来获取它

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);
}
这将准备左右两侧的页面(相邻页面)

默认值为1

因此,在您的示例中,我们需要获取由viewPager创建的当前片段

SparseArray中创建片段时,您可以通过使用位置覆盖viewPager的实例化Item()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);
}
private SparseArray registeredFragments=new SparseArray();
@凌驾
公共对象实例化项(视图组容器,int位置){
Fragment Fragment=(Fragment)super.instanceItem(容器,位置);
注册碎片。放置(位置,碎片);
返回片段;
}
@凌驾
公共项(视图组容器、int位置、对象){
注册碎片。移除(位置);
超级项目(容器、位置、对象);
}
公共片段getFragment(int位置){
返回registeredFragments.get(位置);
}

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

我知道。问题是如何在片段类方法onContextItemSelected()中使ViewPager返回当前页面(而不是邻居)。问题是如何使ViewPager在我的片段类方法onContextItemSelected()中返回当前页面(而不是邻居)。您应该使用ViewPager.OnPageChangedListener,并调用当前片段,以便在用户每次滑动到该片段时调用
registerForContextMenu()
(从
onCreateView()
)中删除调用。有关此方法的示例,请参见此处:您应该使用ViewPager.OnPageChangedListener,并调用当前片段,以便在用户每次滑动到该片段时调用
registerForContextMenu()
(从
onCreateView()
中删除调用)。有关此方法的示例,请参见此处:
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);
}