2012-06-08 54 views
5

我有一個顯示html文件的webview。當用戶在webview中滾動到這個文件的底部時,我想要一個以前隱藏的按鈕來顯示,然後用戶可以按下做一些活動Android:一旦webview完成滾動,就可以看到一個按鈕滾動

我在iOS中做了類似的事情,我剛剛設置委託給ViewController,並將該按鈕設置爲可見。我如何在Android上做類似的事情?我注意到沒有像iOS這樣的回調方法。

編輯:現在,我有一個包含2個對象的活動:一個包含我的文本的webview和一個當前不可見的按鈕。我想我的活動接收消息時的WebView文本滾動至底部,並可見按鈕

回答

0

試試這個:

@Override 
protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
     View view = (View) getChildAt(getChildCount()-1); 
     int diff = (view.getBottom()-(getHeight()+getScrollY()));// Calculate the scrolldiff 
     if(diff == 0){ // if diff is zero, then the bottom has been reached 
      Log.d(ScrollTest.LOG_TAG, "MyScrollView: Bottom has been reached"); 
      yourButton.setVisible(true); 
     } 
     super.onScrollChanged(l, t, oldl, oldt); 
} 

爲了實現這一點,延長滾動型,然後重寫onScrollChanged方法(繼承從視圖)。

+0

雖然webview沒有引用按鈕。 – Daniel

-1

解決方案並沒有完全爲我工作了類似的問題(隱藏按鈕,而webView正在滾動,滾動結束後顯示)。我想要的原因它在滾動時隱藏是因爲我想隱藏的按鈕是跳到webview的最底層,當它只在webview是靜態時才起作用,但在視圖仍在滾動時沒有跳到底部。 所以我做了以下內容:

增加了onScrollChanged回調覆蓋web視圖,如建議附近:

private OnScrollChangedCallback mOnScrollChangedCallback; 

public OnScrollChangedCallback getOnScrollChangedCallback() { 
    return mOnScrollChangedCallback; 
} 

public void setOnScrollChangedCallback(
     final OnScrollChangedCallback onScrollChangedCallback) { 
    mOnScrollChangedCallback = onScrollChangedCallback; 
} 

@Override 
protected void onScrollChanged(final int l, final int t, final int oldl, 
     final int oldt) { 
    super.onScrollChanged(l, t, oldl, oldt); 
    if (mOnScrollChangedCallback != null){ 
     mOnScrollChangedCallback.onScrollChanged(l, t); 
    } 
} 

/** 
* Implement in the activity/fragment/view that you want to listen to the 
* webview 
*/ 
public static interface OnScrollChangedCallback { 
    public void onScrollChanged(int l, int t); 
} 

,並在我的活動類,它實現OnScrollChangedCallback

更新:

Timer timer2showJumpButton; 
private long lastScrollEventTimestamp; 
public final static int HIDING_JUMP_BUTTON_ON_SCROLL_DELAY = 500; 

    public void onScrollChanged(int l, int t) { 

    // showing button when scrolling starts 
    if (btnJumpToBottom != null) { 
     btnJumpToBottom.setVisibility(View.VISIBLE); 
    } 

    if (btnJumpToTop!= null) { 
     btnJumpToTop.setVisibility(View.VISIBLE); 
    } 


    if (timer2showJumpButton == null) { 

     final Runnable r2 = new Runnable() { 

      @Override 
      public void run() { 
       if (btnJumpToBottom != null) { 
        btnJumpToBottom.setVisibility(View.GONE); 
       } 
       if (btnJumpToTop!= null) { 
        btnJumpToTop.setVisibility(View.GONE); 
       } 

      } 
     }; 

     TimerTask timerTask = new TimerTask() { 
      @Override 
      public void run() { 
       if (btnJumpToTop.getVisibility() == View.VISIBLE || btnJumpToBottom.getVisibility() == View.VISIBLE){ 
        long currentTimestamp = System.currentTimeMillis(); 

        if (currentTimestamp - lastScrollEventTimestamp > HIDING_JUMP_BUTTON_ON_SCROLL_DELAY1){       
         webView.postDelayed(r2, HIDING_JUMP_BUTTON_ON_SCROLL_DELAY); 
        }else{ 
         //too soon 
        } 
       } 
      } 
     }; 

     try { 
      timer2showJumpButton = new Timer(); 
      timer2showJumpButton.schedule(timerTask, 500, 500); 
     } catch (IllegalStateException e) { 
      logger.warn(TAG + "/onScrollChanged/" + e.getMessage()); 

     } 
    } 

    // adding runnable which will hide button back 
    long currentTimestamp = System.currentTimeMillis(); 

    lastScrollEventTimestamp = currentTimestamp; 
} 
+0

發現「web.pageDown(true);」在滾動期間工作,但「web.scrollTo(0,scrollTo);」被忽略。 – shtolik

+0

當頁面滾動時,你會得到數百個onScrollChanged回調,並且會分配大量的Timer對象:)一種方法是有一個定時器/線程,它將以固定間隔(〜500ms)運行。然後,您將在onScrollChanged上記錄上次滾動時間戳,並根據上次滾動時間戳禁用/啓用定時器上的按鈕。 – noxo

+0

回覆相應更新 – shtolik

0

僅當webview到達/滾動到底部時加載/可見按鈕。

創建JavaScript類:

public class JavaScriptInterface { 

    @android.webkit.JavascriptInterface 
    public void didScrollToBottom() { 
    Log.d(TAG, "Scroll to Bottom"); 
    myHandler.post(new Runnable() { 
     @Override 
     public void run() { 
     btnAccept.setVisibility(View.VISIBLE); 

      } 
     }); 
     } 
    } 

在的onCreate():

final JavaScriptInterface jsInterface = new JavaScriptInterface(); 
myWebView.addJavascriptInterface(jsInterface, "AndroidFunction"); 
0

[我不能回答評論,所以在這裏留下我的評論作爲一個新的答案]

卡拉拉的答案(第一個)效果很好,除了在

protected void onScrollChanged(int left, int top, int oldLeft, int oldTop) 

方法,調用

getContentHeight() 

對我來說是極不準確。它報告的值太小,所以當用戶只在WebView的三分之一處滾動時,我的聽衆纔會被調用。我用

computeVerticalScrollRange() 

取而代之,這是完美的。感謝this post提供有用的提示。