我有一个WebView ,可用来在我的应用程序本地加载一些html内容。 它首先加载内容,然后调用JavaScript函数,然后将WebView滚动到特定位置。

以下代码说明了如何执行此操作:

public class MyActivity extends Activity {

private WebView web1;
private int ID;
private MyWebViewClient webViewClient1;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);

        // Get the ID of the law to be loaded.
        ID = getIntent().getIntExtra("element_id", 1);

        web1 = (WebView) findViewById(R.id.web1);
        web1.getSettings().setJavaScriptEnabled(true);

        // Initialize the webViewClients.
        webViewClient1 = new MyWebViewClient(true);

        web1.setWebViewClient(webViewClient1);

        displayArticle(web1);
    }

private void displayArticle (WebView wv) {

StringBuilder sb = new StringBuilder();

// Code to build the HTML String.

String finalHtml = sb.toString();

            wv.loadDataWithBaseURL("file:///android_asset/html/", finalHtml, "text/html", "UTF-8", null);

}

private class MyWebViewClient extends WebViewClient {
        String urlToLoad;

        MyWebViewClient (boolean setUrlToLoad) {
            if (setUrlToLoad) {
                setUrlToLoad();
            }           
        }

        public void setUrlToLoad () {
            this.urlToLoad = "javascript:(function () {" +
                    "var elem = document.getElementById('e"+ID+"');" +
                    "var x = 0;" +
                    "var y = 0;" +
                    "while (elem != null) {" +
                    "x += elem.offsetLeft;" +
                    "y += elem.offsetTop;" +
                    "elem = elem.offsetParent;" +
                    "}" +
                    "window.scrollTo(x, y);" +
                    "})()";
        }

        @Override 
        public void onPageStarted (WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            Log.d("Pages", "Page loading started");
        }

        @Override
        public void onReceivedError (WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
            Log.d("Pages", "Webview content load error");
        }

        @Override
        public void onPageFinished (WebView view, String url) {
            super.onPageFinished(view, url);
            Log.d("Pages", "Page loading finished");

            if (urlToLoad != null) {
                // Scroll to the position.
                view.loadUrl(urlToLoad);
                urlToLoad = null;
            }
        }
    }
}

在上面的代码中,回调函数MyWebViewClient类被称为用于使用所述第一请求wv.loadDataWithBaseURLdisplayArticle(WebView wv)的功能,但是当请求完成和onPageFinished被调用时, view.loadUrl(urlToLoad); 调用不会从MyWebViewClient调用另一组回调。 我不确定为什么,因为它必须与我最初使用的WebView相同,并且应该具有MyWebViewClient集的相同实例。

而且,我使用相同的WebView进行了其他loadUrl调用,并且此行为仍然存在。

如果有人能解释为什么会发生,我将不胜感激。

===============>>#1 票数:0

loadUrl("javascript:...")有点特殊情况:它在当前页面的上下文中评估JavaScript代码(就像<a href='javascript:...'>clicky</a>那样)因此,您将不会获得onPageStarted / onPageFinished回调。

  ask by Rameez Hussain translate from so

未解决问题?本站智能推荐:

2回复

WebViewClient和onKeyDown的问题

我目前正在尝试制作一个基于WebView的应用程序。 这是我目前拥有的代码: MainActivity.java中的“ NewWebViewClient”类也位于该类下 Android Studio没有显示任何错误。 但是,如果我想在智能手机上启动该应用程序,它将崩溃。
2回复

WebView,WebViewClient和链接

我是否需要实现自己的WebViewClient以便WebView处理通用链接,例如geo:,tel:和mailto :? WebView无法独自处理吗?
1回复

Android-WebviewClient onReceivedHttpError确定是否为主要资源

不推荐使用WebViewClient.onReceivedError ,现在我必须使用onReceivedHttpError来处理Webview错误,但是此方法从任何资源接收错误,这不是我想要的。 我只希望检测主URL失败 。 如果我使用的是API 10,应该如何检测该错误?
1回复

在WebViewClient中覆盖shouldInterceptRequest时系统崩溃

目标: 覆盖WebView发出的所有请求并自行发出请求(最终设置代理)。 码: 这些请求似乎都很好,但最终我得到了一个堆栈跟踪,其中包含以下两个问题之一: 这显然表明操作系统用完了文件描述符(fid) 要么 (SYSTEM_TOMBSTONE) 这
1回复

Android:Android 4.4中的shouldOverrideUrlLoading方法之后未调用WebView onPageFinished

我正在使用WebView android 4.4进行URL重定向时,加载轮继续加载,无法正确关闭。 我用谷歌搜索了很多,但没有得到。 谁能解释一下WebView android 4.4的流程。 这是我尝试的代码: 请求网址“ www.google.com”。 WebView设置很
2回复

Android WebViewClient URL重定向(Android URL加载系统)

我尝试使用以下ShouldInterceptRequest拦截ShouldInterceptRequest请求: ShouldInterceptRequest ,在其中使用HttpUrlConnection从服务器获取数据,将其设置为遵循重定向,这对webviewclient是透明的。 这意味
2回复

Android-WebView的onReceivedHttpAuthRequest()不再被调用

我正在使用基于webview的应用程序,我在webview中呈现URL。 Url具有HTTP身份验证。 当我第一次启动url时,会调用onReceivedHttpAuthRequest()并显示一个对话框,供用户输入身份验证凭据,即auth用户名和密码。 在提交请求时,请继续并加
2回复

Android - webview - shouldOverrideUrlLoading未调用 - 当用户点击iframe内的链接时

在我们的应用程序中,我们使用webview在视图中加载外部链接。 使用loadurl方法加载链接并设置webview客户端以显示预加载器和webchrome客户端以监听webview的任何链接更改。 在webview中加载的URL。 当链接加载时,有几个iframe,在其中我们有一个文
1回复

适用于Android的WebViewClient问题

WebViewPage.java 这是我的代码,用于在android中隐藏地址栏。 更改此方向(垂直或水平)后,我以一个方向登录页面,可能会退出原因?请编辑此代码... 我在应用程序中使用了JavaScript日历,如果没有webView.setWebViewClient(n
3回复

android:webview无法使用自定义WebViewClient加载javascript

我有一个非常基本的WebView ,在尝试添加自定义webViewClient并停止处理JavaScript webViewClient ,它一直有效。 难道我做错了什么? 还有另一种方法可以摆脱WebView中的地址栏和菜单选项吗?