Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:查看包含滚动视图的片段页面,如何在OnPause中将滚动视图重置到屏幕顶部_Android - Fatal编程技术网

Android:查看包含滚动视图的片段页面,如何在OnPause中将滚动视图重置到屏幕顶部

Android:查看包含滚动视图的片段页面,如何在OnPause中将滚动视图重置到屏幕顶部,android,Android,背景 FragmentList包含一个带有基础FragmentStatePagerAdapter的视图寻呼机,用于显示FragmentDetail页面 FragmentDetail包含一个滚动视图 我想做什么 当您滑动时,我希望将上一个FragmentDetail滚动位置重置为顶部。此时,当您滑回它时,滚动位置回到您停止的位置 例如,我在查看页面的第1页,我滚动到当前详细信息片段的底部。然后我进入下一页。最后我回到第一页,我希望卷轴在顶部,而不是我留下的地方 我尝试了以下方法 在片段细节的暂停中

背景

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
实际上比较困难。我建议,如果您在实现这一点上遇到问题,请在当前代码中发布一个新问题,以便社区能够更好地帮助您。