我已将TapTargetView库实施到我的应用中。
传递某个元素后,我需要关注此时屏幕外的下一个视图:
@Override
public void onSequenceStep(TapTarget lastTarget) {
if (lastTarget.id() == 7) {
flavorContainer.setFocusableInTouchMode(true);
flavorContainer.requestFocus();
}
}
在我在屏幕底部添加广告单元之前,一切都很好。所以现在广告背后会显示必要的元素。
方法 requestFocus()仅将布局滚动到必要的视图,但不会显示在屏幕的末尾。
我需要一种方法,将屏幕内容滚动到非常结束,而不仅仅是在屏幕上显示必要的视图。有可能吗?
布局结构
<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>
答案 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