Android 需要帮助修复在viewpager中获取当前视图的代码吗

Android 需要帮助修复在viewpager中获取当前视图的代码吗,android,Android,需要帮助来修复我在一篇文章中看到的代码。我需要的解决方案是在基于viewpager的应用程序中获取任何页面的当前视图 以下是参考代码 public View getCurrentView(ViewPager pager) { for (int i = 0; i < pager.getChildCount(); i++) { View child = pager.getChildAt(i); if (child.getX() <= pager.getScrollX()

需要帮助来修复我在一篇文章中看到的代码。我需要的解决方案是在基于viewpager的应用程序中获取任何页面的当前视图

以下是参考代码

public View getCurrentView(ViewPager pager) {
for (int i = 0; i < pager.getChildCount(); i++) {
    View child = pager.getChildAt(i);
    if (child.getX() <= pager.getScrollX() + pager.getWidth()
         && child.getX() + child.getWidth() >= pager.getScrollX() + pager.getWidth()) {
        return child;
     }

 }
return getChildAt(0);

很难用代码示例在注释中进行讨论

正如我在grepcode中看到的那样,接收
对象
As
android.support.v4.app.Fragment
。但当您尝试将对象强制转换为
片段
时,会收到
ClassCastException
。你能检查你的施法吗:你真的在
android.support.v4.app.Fragment
而不是
android.app.Fragment
中施法对象吗?如果可以,请在问题中添加例外消息

更新:

如果您的
ScreenSlidePagerAdapter
具有方法getCurrentView(),则您的方法“getCurrentView()”可以如下工作:

public View getCurrentView(ViewPager pager) {
    return ((ScreenSlidePagerAdapter) pager.getAdapter()).getCurrentView();
}
屏幕幻灯片适配器的方法
getCurrentView()

public View getCurrentView() {
    return currView;
}
更新2:

我对您的代码进行了一些修改:

使用专用适配器执行的活动:

public class myActivity extends FragmentActivity implements ISelectItemListener {
    // Your variable declarations and methods

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        final ViewPager pager = (ViewPager) findViewById(R.id.pager);

        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        pager.setAdapter(mPagerAdapter);

        pager.setOnPageChangeListener(
                new OnPageChangeListener() {
                    @Override
                    public void onPageSelected(int pageSelected) {
                        final ScreenSlidePageFragment fragment = mPagerAdapter.getFragment(pageSelected);

                        if (fragment != null) {
                            fragment.doTextViewChnges();
                        }
                    }

                    @Override
                    public void onPageScrollStateChanged(int arg0) {
                        // TODO Auto-generated method stub
                    }

                    @Override
                    public void onPageScrolled(int arg0, float arg1, int arg2) {
                        // TODO Auto-generated method stub
                    }
                });
    }

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        //Your variable declarations

        private final ScreenSlidePageFragment[] mFragments;

        public ScreenSlidePagerAdapter(android.support.v4.app.FragmentManager fm) {
            super(fm);

            mFragments = new ScreenSlidePageFragment[NUM_PAGES];
        }

        @Override
        public int getCount() {
            return NUM_PAGES;
        }




        // It will create new ScreenSlidePageFragment by position if it's not exsist
        @Override
        public android.support.v4.app.Fragment getItem(int position) {
            if (getFragment(position) == null) {
                mFragments[position] = ScreenSlidePageFragment.create(position, <other parameters I want to pass>);
            }

            return getFragment(position);
        }

        // It will give you ScreenSlidePageFragment if it's exists, or null
        public ScreenSlidePageFragment getFragment(int position) {
            return mFragments[position];
        }
    }
}

尝试使用链接中的其他答案:。您只需要重写PagerAdapter的一个方法,并添加像getCurrentView()这样的方法。我尝试了这个选项。但在我使用FragmentStatePagerAdapter时,它给了我classcast异常。您可以在setPrimaryItem()中尝试此操作:mCurrentView=((Fragment)object).getView();或者,如果您将创建的片段保存在集合中,请使用适配器的getItem()方法按位置获取片段,并再次从中获取getView().classcast异常。下面是代码私有类ScreenSlidePageAdapter扩展FragmentStatePagerAdapter{public ScreenSlidePageAdapter(android.support.v4.app.FragmentManager fm){super(fm);}覆盖public android.support.v4.app.Fragment getItem(int position){返回ScreenSlidePageFragment.create(position);}重写public int getCount(){return NUM_PAGES;}重写public void setPrimaryItem(视图组容器,int位置,对象对象){currView=((片段)对象)。getView();}你说得很好。我应该使用android.support.v4.app.Fragment。我将代码更新到下面,classcastexception就消失了。@重写公共void setPrimaryItem(ViewGroup容器,int位置,Object对象){currView=((android.support.v4.app.Fragment)对象)。getView();}但您能建议我在public void onPageSelected(int pageSelected)中做什么吗?调用我的OnPageChangeListener(已添加到我的Viewpager中)以获取对当前视图的引用。@user1938357,我正在更新我的答案,但我没有正确理解您的最后一个问题“但你能建议我在onPageSelected()调用我的OnPageChangeListener(我已经添加到我的Viewpager中)中如何获取当前视图的引用”如果这不能解决你的问题,可以用另一种方式提问(我不知道你的完整代码,你有哪些字段和公共变量,因此我不能给你建议).我已经用代码更新了我的帖子。同时让我试试你的建议made@user1938357,我将更新我的答案,并对您的代码进行类似的修改。
public View getCurrentView() {
    return currView;
}
public class myActivity extends FragmentActivity implements ISelectItemListener {
    // Your variable declarations and methods

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        final ViewPager pager = (ViewPager) findViewById(R.id.pager);

        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        pager.setAdapter(mPagerAdapter);

        pager.setOnPageChangeListener(
                new OnPageChangeListener() {
                    @Override
                    public void onPageSelected(int pageSelected) {
                        final ScreenSlidePageFragment fragment = mPagerAdapter.getFragment(pageSelected);

                        if (fragment != null) {
                            fragment.doTextViewChnges();
                        }
                    }

                    @Override
                    public void onPageScrollStateChanged(int arg0) {
                        // TODO Auto-generated method stub
                    }

                    @Override
                    public void onPageScrolled(int arg0, float arg1, int arg2) {
                        // TODO Auto-generated method stub
                    }
                });
    }

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        //Your variable declarations

        private final ScreenSlidePageFragment[] mFragments;

        public ScreenSlidePagerAdapter(android.support.v4.app.FragmentManager fm) {
            super(fm);

            mFragments = new ScreenSlidePageFragment[NUM_PAGES];
        }

        @Override
        public int getCount() {
            return NUM_PAGES;
        }




        // It will create new ScreenSlidePageFragment by position if it's not exsist
        @Override
        public android.support.v4.app.Fragment getItem(int position) {
            if (getFragment(position) == null) {
                mFragments[position] = ScreenSlidePageFragment.create(position, <other parameters I want to pass>);
            }

            return getFragment(position);
        }

        // It will give you ScreenSlidePageFragment if it's exists, or null
        public ScreenSlidePageFragment getFragment(int position) {
            return mFragments[position];
        }
    }
}
public class ScreenSlidePageFragment extends Fragment {
    //Your variables and methods

    public static ScreenSlidePageFragment create(int pageNumber, String[] pages, int bookmarkPageNumber, String storyName, int linesInOnePage) {
        final Bundle args = new Bundle();
        args.putInt(ARG_PAGE, pageNumber);
        args.putStringArray(ARG_PAGEARRAY, pages);

        final ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
        fragment.setArguments(args); 

        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPageNumber = getArguments().getInt(ARG_PAGE);
        pages = getArguments().getStringArray(ARG_PAGEARRAY);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = (ViewGroup) inflater.inflate(R.layout.activity_story, container, false);

        loadView(rootView);
        return rootView;
    }

    public int getPageNumber() {
        return mPageNumber;
    }

    // Let's keep logic of modifications in fragment
    public void doTextViewChnges() {
        final View view = getView();
        // do what you want with your View and his children
    }
}