Android:查看包含滚动视图的片段页面,如何在OnPause中将滚动视图重置到屏幕顶部
背景 FragmentList包含一个带有基础FragmentStatePagerAdapter的视图寻呼机,用于显示FragmentDetail页面 FragmentDetail包含一个滚动视图 我想做什么 当您滑动时,我希望将上一个FragmentDetail滚动位置重置为顶部。此时,当您滑回它时,滚动位置回到您停止的位置 例如,我在查看页面的第1页,我滚动到当前详细信息片段的底部。然后我进入下一页。最后我回到第一页,我希望卷轴在顶部,而不是我留下的地方 我尝试了以下方法 在片段细节的暂停中,我尝试了以下代码Android:查看包含滚动视图的片段页面,如何在OnPause中将滚动视图重置到屏幕顶部,android,Android,背景 FragmentList包含一个带有基础FragmentStatePagerAdapter的视图寻呼机,用于显示FragmentDetail页面 FragmentDetail包含一个滚动视图 我想做什么 当您滑动时,我希望将上一个FragmentDetail滚动位置重置为顶部。此时,当您滑回它时,滚动位置回到您停止的位置 例如,我在查看页面的第1页,我滚动到当前详细信息片段的底部。然后我进入下一页。最后我回到第一页,我希望卷轴在顶部,而不是我留下的地方 我尝试了以下方法 在片段细节的暂停中
@Override
public void onPause() {
super.onPause();
mScrollView.scrollTo(0,0);
}
我还尝试了以下方法
@Override
public void onPause() {
super.onPause();
mScrollView.post(new Runnable() {
@Override
public void run() {
mScrollView.fullScroll(View.FOCUS_UP);
}
});
}
另外,将scrollTo代码放在可运行的环境中也是很好的
不滚动到顶部忘记onPause()
;你会把自己逼疯的
我发现最好的方法是重写FragmentPagerAdapter
子类中的setPrimaryItem()
<每当ViewPager
显示片段时,就会调用code>setPrimaryItem()
假设您有一个如下所示的界面:
public interface ResettableFragment {
public void reset();
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
if (mLast != null) {
mLast.reset();
mLast = null;
}
if (object instanceof ResettableFragment) {
mLast = (ResettableFragment) object;
}
}
viewPager.addOnPageChangeListener(new SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
if (position == POSITION_OF_PAGE_TO_RESET + 1 ||
position == POSITION_OF_PAGE_TO_RESET - 1) {
FragmentPagerAdapter adapter = (FragmentPagerAdapter) viewPager.getAdapter();
ResettableFragment fragment = (ResettableFragment) adapter.getItem(position);
fragment.reset();
}
}
});
因此,您的片段实现是:
@Override
public void reset() {
mScrollView.scrollTo(0,0);
}
在FragmentPagerAdapter
子类中,创建一个成员
private ResettableFragment mLast;
然后像这样重写setPrimaryItem()
:
public interface ResettableFragment {
public void reset();
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
if (mLast != null) {
mLast.reset();
mLast = null;
}
if (object instanceof ResettableFragment) {
mLast = (ResettableFragment) object;
}
}
viewPager.addOnPageChangeListener(new SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
if (position == POSITION_OF_PAGE_TO_RESET + 1 ||
position == POSITION_OF_PAGE_TO_RESET - 1) {
FragmentPagerAdapter adapter = (FragmentPagerAdapter) viewPager.getAdapter();
ResettableFragment fragment = (ResettableFragment) adapter.getItem(position);
fragment.reset();
}
}
});
有些人喜欢注册一个ViewPager.OnPageChangListener
,它覆盖onPageSelected()
,而不是覆盖适配器中的setPrimaryItem()
可能看起来像这样:
public interface ResettableFragment {
public void reset();
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem(container, position, object);
if (mLast != null) {
mLast.reset();
mLast = null;
}
if (object instanceof ResettableFragment) {
mLast = (ResettableFragment) object;
}
}
viewPager.addOnPageChangeListener(new SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
if (position == POSITION_OF_PAGE_TO_RESET + 1 ||
position == POSITION_OF_PAGE_TO_RESET - 1) {
FragmentPagerAdapter adapter = (FragmentPagerAdapter) viewPager.getAdapter();
ResettableFragment fragment = (ResettableFragment) adapter.getItem(position);
fragment.reset();
}
}
});
请您展示一下其他的实现方式好吗?我在PageChangeListener上找不到此问题的
代码。这个对我不起作用。@rupinderjeet47请查看我的更新答案。由于您必须访问当前页面旁边的片段,因此执行OnPageChangeListener
实际上比较困难。我建议,如果您在实现这一点上遇到问题,请在当前代码中发布一个新问题,以便社区能够更好地帮助您。