为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Android中为WebView制作滚动侦听器

如何在Android中为WebView制作滚动侦听器

HUWWW 2019-11-13 09:31:49
如何WebView在Android中实现Scroll Listener我尝试了这个,但它没有调用Log.i滚动Webview。package com.example.webview.full.width;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.webkit.WebView;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;public class scorllableWebview extends WebView implements OnScrollListener {Context ctx;AttributeSet atrs;public scorllableWebview(Context context) {    super(context);    ctx = context;}public scorllableWebview(Context context, AttributeSet atters){    super(context, atters);    ctx = context;    atrs = atters;}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,        int visibleItemCount, int totalItemCount) {    Log.i("onScroll", "Called");}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {    Log.i("onScrollStateChanged", "Called");}}这是我的 MainActivity.javapackage com.example.webview.full.width;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.view.Menu;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Toast;public class MainActivity extends Activity {ProgressDialog progressDialog;scorllableWebview wv;@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    wv = (scorllableWebview) findViewById(R.id.scorllableWebview);    wv.getSettings().setJavaScriptEnabled(true);    wv.getSettings().setBuiltInZoomControls(true);    wv.getSettings().supportZoom();    progressDialog = ProgressDialog.show(MainActivity.this,            "Loading Book...!", "Please Wait");    progressDialog.setCancelable(true);    });
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

就像是:


public class ObservableWebView extends WebView

{

    private OnScrollChangedCallback mOnScrollChangedCallback;


    public ObservableWebView(final Context context)

    {

        super(context);

    }


    public ObservableWebView(final Context context, final AttributeSet attrs)

    {

        super(context, attrs);

    }


    public ObservableWebView(final Context context, final AttributeSet attrs, final int defStyle)

    {

        super(context, attrs, defStyle);

    }


    @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.onScroll(l, t, oldl, oldt);

    }


    public OnScrollChangedCallback getOnScrollChangedCallback()

    {

        return mOnScrollChangedCallback;

    }


    public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback)

    {

        mOnScrollChangedCallback = onScrollChangedCallback;

    }


    /**

     * Impliment in the activity/fragment/view that you want to listen to the webview

     */

    public static interface OnScrollChangedCallback

    {

        public void onScroll(int l, int t, int oldl, int oldt);

    }

}

应该可以使用,但未经测试,但是可以在Android中的几乎所有其他视图上使用。


您将实现如下:


wv = (ObservableWebView) findViewById(R.id.scorllableWebview);

wv.setOnScrollChangedCallback(new OnScrollChangedCallback(){

    public void onScroll(int l, int t, int oldl, int oldt){

        if(t> oldt){

            //Do stuff

            System.out.println("Swipe UP");

            //Do stuff

        }

        else if(t< oldt){

            System.out.println("Swipe Down");

        }

        Log.d(TAG,"We Scrolled etc...");

    }

});


查看完整回答
反对 回复 2019-11-13
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

从API 23开始,您不再需要这样做,您只需 在所有视图(包括WebView)上使用新的OnScrollChangeListener即可。但是由于您仍然需要支持旧版本,因此仍然可以使用@ Chris.Jenkins的建议。我对提议的类进行了一些调整,使其与新的OnScrollChangeListener接口“更加兼容”:


public class ObservableWebView extends WebView {

private OnScrollChangeListener onScrollChangeListener;


public ObservableWebView(Context context) {

    super(context);

}


public ObservableWebView(Context context, AttributeSet attrs) {

    super(context, attrs);

}


public ObservableWebView(Context context, AttributeSet attrs, int defStyleAttr) {

    super(context, attrs, defStyleAttr);

}


@Override

protected void onScrollChanged(int l, int t, int oldl, int oldt) {

    super.onScrollChanged(l, t, oldl, oldt);

    if (onScrollChangeListener != null) {

        onScrollChangeListener.onScrollChange(this, l, t, oldl, oldt);

    }

}


public void setOnScrollChangeListener(OnScrollChangeListener onScrollChangeListener) {

    this.onScrollChangeListener = onScrollChangeListener;

}


public OnScrollChangeListener getOnScrollChangeListener() {

    return onScrollChangeListener;

}


public interface OnScrollChangeListener {

    /**

     * Called when the scroll position of a view changes.

     *

     * @param v          The view whose scroll position has changed.

     * @param scrollX    Current horizontal scroll origin.

     * @param scrollY    Current vertical scroll origin.

     * @param oldScrollX Previous horizontal scroll origin.

     * @param oldScrollY Previous vertical scroll origin.

     */

    void onScrollChange(WebView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY);

}

}


查看完整回答
反对 回复 2019-11-13
?
繁星淼淼

TA贡献1775条经验 获得超11个赞

这是公认的答案的更优雅的Kotlin版本



class ObservableWebView @JvmOverloads constructor(

        context: Context,

        attrs: AttributeSet? = null,

        defStyleAttr: Int = 0

) : WebView(context, attrs, defStyleAttr) {

    var scrollListener: WebViewScrollListener? = null


    override fun onScrollChanged(scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int) {

        super.onScrollChanged(scrollX, scrollY, oldScrollX, oldScrollY)

        when {

            scrollY > oldScrollY -> scrollListener?.onScrollDown()

            scrollY < oldScrollY -> scrollListener?.onScrollUp()

        }

        scrollListener?.onScroll(scrollX, scrollY, oldScrollX, oldScrollY)

    }

}


interface WebViewScrollListener{

    fun onScroll(scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int)


    fun onScrollDown()


    fun onScrollUp()

}


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 734 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信