需要帮助来修复在 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 ScreenSlidePagerAdapter(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 为单位)