2012-06-08 36 views
5

私はhtmlファイルを表示するwebviewを持っています。ユーザーがwebviewでこのファイルの一番下までスクロールすると、以前は表示されていなかったボタンが表示され、何らかの操作を行うために押すことができます。Android:一度ボタンを表示すると、webviewはスクロールします

iOSで同様のことをしました。 ViewControllerにデリゲートし、ボタンを可視に設定します。 Androidで同様のことをするにはどうすればよいですか?私は、iOSのようなコールバックメソッドがないことに気付きました。

編集:現在、私は2つのオブジェクト、すなわち、テキストを含むWebビュー、および現在表示されていないボタンを持つアクティビティを持っています。私は私の活動をするときの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); 
} 

、これを実装ScrollViewを拡張して、onScrollChangedメソッドをオーバーライドするには(継承しますビューから)。

+0

ウェブビューにはボタンの参照はありません。 – Daniel

2

ユーザーがEULAの一番下までスクロールしたら、「同意する」ボタンを表示するために、自分で行う必要がありました。弁護士、ね?

実際、@JackTurkyの答えのようにScrollViewではなくWebViewをオーバーライドすると、getBottom()ではなく、コンテンツの高さを取得するためにgetContentHeight()を呼び出すことができます。役に立たない。

これは私の包括的な解決策です。限り、これはすべてのAPIレベル1のものですので、どこでも動作するはずです。

EulaWebView mEulaContent; 
Button mEulaAgreed; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.eula); 
    mEulaContent = (EulaWebView) findViewById(R.id.eula_content); 
    StaticHelpers.loadWebView(this, mEulaContent, R.raw.stylesheet, StaticHelpers.readRawTextFile(this, R.raw.eula), null); 
    mEulaContent.setVerticalScrollBarEnabled(true); 
    mEulaContent.setOnBottomReachedListener(this, 50); 

    mEulaAgreed = (Button) findViewById(R.id.eula_agreed); 
    mEulaAgreed.setOnClickListener(this); 
    mEulaAgreed.setVisibility(View.GONE); 
} 

@Override 
public void onBottomReached(View v) { 
    mEulaAgreed.setVisibility(View.VISIBLE); 
} 
:ユーザーは「OnBottomReachedListenerを実装」クラスに(私はこのようにそれを呼び出すのWebViewの下にスクロールした後
public class EulaWebView extends WebView { 
    public EulaWebView(Context context) 
    { 
     this(context, null); 
    } 

    public EulaWebView(Context context, AttributeSet attrs) 
    { 
     this(context, attrs, 0); 
    } 

    public EulaWebView(Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
    } 

    public OnBottomReachedListener mOnBottomReachedListener = null; 
    private int mMinDistance = 0; 

    /** 
    * Set the listener which will be called when the WebView is scrolled to within some 
    * margin of the bottom. 
    * @param bottomReachedListener 
    * @param allowedDifference 
    */ 
    public void setOnBottomReachedListener(OnBottomReachedListener bottomReachedListener, int allowedDifference) { 
     mOnBottomReachedListener = bottomReachedListener; 
     mMinDistance = allowedDifference; 
    } 

    /** 
    * Implement this interface if you want to be notified when the WebView has scrolled to the bottom. 
    */ 
    public interface OnBottomReachedListener { 
     void onBottomReached(View v); 
    } 

    @Override 
    protected void onScrollChanged(int left, int top, int oldLeft, int oldTop) { 
     if (mOnBottomReachedListener != null) { 
      if ((getContentHeight() - (top + getHeight())) <= mMinDistance) 
       mOnBottomReachedListener.onBottomReached(this); 
     } 
     super.onScrollChanged(left, top, oldLeft, oldTop); 
    } 

} 

は、私は、これは「同意する」ボタンを表示するために使用します

は一番下に到達するので、とき(あるいは、彼らはそれの50個のピクセル以内に取得するとき、この場合には、)「私は同意する」ボタンが表示されます。完全に(同様の問題のために私のために動作しませんでした

+0

こんにちは、 'StaticHelpers'が宣言されている場所を教えてください。 –

+0

StaticHelpersは、いくつかの一般的な目的のメソッドを持つ内部クラスです。この場合は、Webviewを読み込んだり、ファイルシステムからテキストファイルを読み込んだりします。 – karora

-1

ソリューションの上WebViewがスクロールされている間はボタンを隠す、スクロールが終わったら表示する)私は非表示にしたいボタンがwebviewの一番下にジャンプするためのもので、webviewが静的であるときにはうまくいきましたが、ビューがまだスクロールされている間は下にジャンプしませんでした。 だから私は次のようでした。近くの提案のように

は、WebViewのを上書きするonScrollChangedコールバックを追加しました:

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); 
} 

UPDATED 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オブジェクトを大量に割り当てます:) 1つの方法は、一定の間隔(約500ms)で実行される1つのタイマー/スレッドを持つことです。その後、最後のスクロールタイムスタンプをonScrollChangedに記録し、最後のスクロールタイムスタンプに応じてタイマーのボタンを無効/有効にします。 – noxo

+0

応じて更新された返信 – shtolik

0

ウェブビューに達した/下にスクロールしたときにのみロード/表示ボタン。

JavaScriptクラスを作成しますのonCreateで

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); 

      } 
     }); 
     } 
    } 

を():

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

[私はので、新しい答えとしてここに私のコメントを残して、答えにコメントすることはできません]

カタロラの答え(最初のもの)は非常によく機能しますが、それ以外は

getContentHeight() 

を呼び出す

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

方法は、私のために乱暴に不正確でした。それは値が非常に小さすぎると報告したので、ユーザーがWebViewを3分の1しかスクロールしていないときにリスナーが呼び出されました。私は代わりに

computeVerticalScrollRange() 

を使用しました。これは完璧です。その役に立つヒントのためにthis postに感謝します。

関連する問題