Android 需要帮助修复在viewpager中获取当前视图的代码吗
需要帮助来修复我在一篇文章中看到的代码。我需要的解决方案是在基于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()
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中看到的那样,接收
对象Asandroid.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
}
}