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

Posted

技术标签:

【中文标题】需要帮助来修复在 viewpager 中获取当前视图的代码【英文标题】:need help to fix code for getting current view in viewpager 【发布时间】:2013-05-05 09:15:49 【问题描述】:

需要帮助来修复我在 https://***.com/a/9275732/1938357 中看到的代码。我需要的解决方案是在基于 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);

我正在尝试访问视图寻呼机中的当前视图并使用上面的代码。当我向前滚动时它工作正常。但是当我向后滚动时,在向后滚动 2 次后,这将停止工作。

Public class myActivity extends FragmentActivity
//Variable declarations
protected void onCreate(Bundle savedInstanceState) 
ViewPager mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
View CurrView;

OnPageChangeListener pageChangelistener = new OnPageChangeListener() 
  @Override
  public void onPageSelected(int pageSelected) 
    doTextViewChnges();//access the text view and update it based on pageSelected
    ---THIS IS WHERE I AM STUCK IN TRYING TO GET THE TEXTVIEW IN MY CURRENT FRAGMWNT/VIEW-------
 

mPager.setOnPageChangeListener(pageChangelistener);

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter  
  public ScreenSlidePagerAdapter(android.support.v4.app.FragmentManager  fm) 
    super(fm);
 

 @Override
 public android.support.v4.app.Fragment getItem(int position)  
    return ScreenSlidePageFragment.create(position, <other parameters I want to pass>);
 

 @Override
 public int getCount() 
    return NUM_PAGES;
 
  

下面是我的 ScreenSlidePageFragment 类

public class ScreenSlidePageFragment extends android.support.v4.app.Fragment 

public static final String ARG_PAGE = "pagenumber";
public static final String ARG_PAGEARRAY = "pages";

private int mPageNumber;
//Declare other variables

@SuppressLint("NewApi")
public static ScreenSlidePageFragment create(int pageNumber, String[] pages, int bookmarkPageNumber, String storyName, int linesInOnePage) 
    ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
    Bundle args = new Bundle();
    args.putInt(ARG_PAGE, pageNumber);
    args.putStringArray(ARG_PAGEARRAY, pages);
    fragment.setArguments(args); 
    return fragment;


@SuppressLint("NewApi")
public ScreenSlidePageFragment() 


@SuppressLint("NewApi")
@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);

    //load layout with all components filled up for that page
    loadView(rootView);
    return rootView;

public int getPageNumber() 
    return mPageNumber;

【问题讨论】:

尝试使用链接中的另一个答案:***.com/a/8638772/1001401。您只需要覆盖 PagerAdapter 的一种方法并添加 getCurrentView() 之类的方法。 我试过这个选项。但是当我使用 FragmentStatePagerAdapter 时,它给了我 classcast 异常。 你可以在 setPrimaryItem() 中尝试这个: mCurrentView = ((Fragment) object).getView();或者,如果您将创建的片段保存在集合中,请使用适配器的 getItem() 方法按位置获取片段并从中获取片段。 再次类转换异常。下面是代码 private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter public Sc​​reenSlidePagerAdapter(android.support.v4.app.FragmentManager fm) super(fm); Override public android.support.v4.app.Fragment getItem(int position) return ScreenSlidePageFragment .create(position); 覆盖 public int getCount() return NUM_PAGES; Override public void setPrimaryItem(ViewGroup container, int position, Object object) currView = ((Fragment) object).getView(); 【参考方案1】:

在 cmets 中很难用代码示例来讨论。

正如我在 grepcode FragmentStatePagerAdapter.setPrimaryItem(), 中看到的那样,将 object 接收为 android.support.v4.app.Fragment。但是当您尝试将对象转换为Fragment 时,您会收到ClassCastException。你能检查一下你的投射:你真的把对象投射到android.support.v4.app.Fragment而不是android.app.Fragment吗?如果没问题,请将您的异常消息添加到您的问题中。

更新:

如果你的 ScreenSlidePagerAdapter 有方法 getCurrentView(),那么你的方法 'getCurrentView()' 可以这样工作:

public View getCurrentView(ViewPager pager) 
    return ((ScreenSlidePagerAdapter) pager.getAdapter()).getCurrentView();

你的ScreenSlidePagerAdapter的方法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];
        
    

你的片段:

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
    

【讨论】:

您注意到了一个好点。我应该使用 android.support.v4.app.Fragment。我将代码更新到下面并且classcastexception消失了。 @Override public void setPrimaryItem(ViewGroup container, int position, Object object) currView = ((android.support.v4.app.Fragment) object).getView();但是你能建议我在我的 OnPageChangeListener(我已添加到我的 Viewpager)中的 public void onPageSelected(int pageSelected) 调用中做什么来获取对当前视图的引用。 @user1938357 ,我更新了我的答案,但我没有正确理解你的最后一个问题“但是你能建议我在我的 OnPageChangeListener 的 onPageSelected() 调用中做什么(我已经添加到我的 Viewpager) 以获取对当前视图的引用”。如果它不能解决你的问题,可以用另一种方式提问(我不知道你的完整代码你有哪些字段和公共变量,因此我不能给你建议)。 我已经用代码更新了我的帖子。同时让我试试你提出的建议 @user1938357 ,我正在通过对您的代码进行类似修改来更新我的答案。

以上是关于需要帮助来修复在 viewpager 中获取当前视图的代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在android的Viewpager中添加imageURL。我需要一个平滑的滑动动作

在ViewPager上,在onPageSelected上的片段上启动动画

获取为 ViewPager 打开视图的时间(以 ms 为单位)

tab界面实现方式之ViewPager+TabPageIndicator

无法在 Viewpager 中获取当前视图

需要帮助修复“最小”输出。此外,通过不使用 Arrays.sort 来更改代码