以编程方式滚动到屏幕的末尾

时间:2017-03-18 14:52:08

标签: android android-layout android-nestedscrollview

我已将TapTargetView库实施到我的应用中。

传递某个元素后,我需要关注此时屏幕外的下一个视图:

@Override
public void onSequenceStep(TapTarget lastTarget) {
  if (lastTarget.id() == 7) {
     flavorContainer.setFocusableInTouchMode(true);
     flavorContainer.requestFocus();
  }
}

在我在屏幕底部添加广告单元之前,一切都很好。所以现在广告背后会显示必要的元素。

enter image description here

方法 requestFocus()仅将布局滚动到必要的视图,但不会显示在屏幕的末尾。

enter image description here

我需要一种方法,将屏幕内容滚动到非常结束,而不仅仅是在屏幕上显示必要的视图。有可能吗?

enter image description here

布局结构

<android.support.design.widget.CoordinatorLayout>
<LinearLayout>
<android.support.v4.widget.NestedScrollView> 
<LinearLayout> 
<android.support.v7.widget.CardView> 
<LinearLayout>

</LinearLayout> 
</android.support.v7.widget.CardView> 
</LinearLayout> 
</android.support.v4.widget.NestedScrollView> 
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>

2 个答案:

答案 0 :(得分:24)

你有两种可能的利弊解决方案。

<强>第一

使用fullScroll(int)上的方法NestedScrollView。在使用此方法之前必须先绘制NestedScrollView,并且之前获得它的View会失去焦点。

nestedScrollView.post(new Runnable() {
    @Override
    public void run() {
        nestedScrollView.fullScroll(View.FOCUS_DOWN);
    }
});

<强>第二

使用方法scrollBy(int,int) / smoothScrollBy(int,int)。它需要更多的代码,但你不会失去当前的焦点:

nestedScrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        final int scrollViewHeight = nestedScrollView.getHeight();
        if (scrollViewHeight > 0) {
            nestedScrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);

            final View lastView = nestedScrollView.getChildAt(nestedScrollView.getChildCount() - 1);
            final int lastViewBottom = lastView.getBottom() + nestedScrollView.getPaddingBottom();
            final int deltaScrollY = lastViewBottom - scrollViewHeight - nestedScrollView.getScrollY();
            /* If you want to see the scroll animation, call this. */
            nestedScrollView.smoothScrollBy(0, deltaScrollY);
            /* If you don't want, call this. */
            nestedScrollView.scrollBy(0, deltaScrollY);
        }
    }
});

答案 1 :(得分:1)

对我来说,效果最好。滚动到底部。

scrollView.smoothScrollTo(0, scrollView.getChildAt(0).height)
// scrollview has always only one child