2017-03-18 66 views
0

我已將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> 

回答

5

你有利弊兩個可能的解決方案。

首先

使用上NestedScrollView方法fullScroll(int)。必須在使用此方法之前繪製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); 
     } 
    } 
});