如果从webview~Android~Java打开,网页内的链接总是返回“404 not found”错误

时间:2016-01-07 06:03:14

标签: java android webview

我有一个webview,打开一个包含一些链接的网页。但是,如果我点击每个链接,它将显示“404 Not Found”错误。我在WebViewClient中完成了shouldOverrideUrlLoading,但结果相同。 请帮忙。提前谢谢。

这就是我设置webview的方式:

WebView web_view = (WebView)view.findViewById(R.id.web_view);
WebSettings webSettings = web_view.getSettings();
web_view.setWebChromeClient(new WebChromeClient(){
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
         progressBar.setProgress(newProgress);
         super.onProgressChanged(view, newProgress);
     }
 });
 web_view.setWebViewClient(new WebViewClient(){
     @Override
     public void onPageFinished(WebView view, String url) {
         progressBar.setVisibility(View.GONE);
         super.onPageFinished(view, url);
     }
     @Override
    public void shouldOverrideUrlLoading(Webview view, String url){
        progressBar.setProgress(0);
        progressBar.setVisibility(View.VISIBLE);
        return super.shouldOverrideUrlLoading(view,url);
    }
 })
 webSettings.setJavaScriptEnabled(true);
 web_view.loadUrl("http://someurl.com");

我也这样做了:

    @Override
    public void shouldOverrideUrlLoading(Webview view, String url){
        progressBar.setProgress(0);
        progressBar.setVisibility(View.VISIBLE);
        view.loadUrl(url);
        return true;
    }

但是他们都导致'404 not found'。

任何帮助请...

2 个答案:

答案 0 :(得分:0)

准备布局以显示错误发生的时间而不是网页(一个脏的'页面未找到的消息')布局有一个按钮," RELOAD"有一些指导信息。

如果发生错误,请记住使用布尔值并显示我们准备的布局。

如果用户点击" RELOAD"按钮,将mbErrorOccured设置为false。并将mbReloadPressed设置为true。 如果mbErrorOccured为false且mbReloadPressed为true,则表示webview加载页面成功。 '如果再次发生错误,mbErrorOccured将在onReceivedError(...)上设置为true 这是我的完整资料来源。看看这个。

公共类MyWebViewActivity扩展ActionBarActivity实现OnClickListener {

private final String TAG = MyWebViewActivity.class.getSimpleName();
private WebView mWebView = null;
private final String URL = "http://www.google.com";
private LinearLayout mlLayoutRequestError = null;
private Handler mhErrorLayoutHide = null;

private boolean mbErrorOccured = false;
private boolean mbReloadPressed = false;

@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_webview);

    ((Button) findViewById(R.id.btnRetry)).setOnClickListener(this);
    mlLayoutRequestError = (LinearLayout) findViewById(R.id.lLayoutRequestError);
    mhErrorLayoutHide = getErrorLayoutHideHandler();

    mWebView = (WebView) findViewById(R.id.webviewMain);
    mWebView.setWebViewClient(new MyWebViewClient());
    WebSettings settings = mWebView.getSettings();
    settings.setJavaScriptEnabled(true);
    mWebView.setWebChromeClient(getChromeClient());
    mWebView.loadUrl(URL);
}

@Override
public boolean onSupportNavigateUp() {
    return super.onSupportNavigateUp();
}

@Override
public void onClick(View v) {
    int id = v.getId();

    if (id == R.id.btnRetry) {
        if (!mbErrorOccured) {
            return;
        }

        mbReloadPressed = true;
        mWebView.reload();
        mbErrorOccured = false;
    }
}

@Override
public void onBackPressed() {
    if (mWebView.canGoBack()) {
        mWebView.goBack();
        return;
    }
    else {
        finish();
    }

    super.onBackPressed();
}

class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return super.shouldOverrideUrlLoading(view, url);
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public void onLoadResource(WebView view, String url) {
        super.onLoadResource(view, url);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        if (mbErrorOccured == false && mbReloadPressed) {
            hideErrorLayout();
            mbReloadPressed = false;
        }

        super.onPageFinished(view, url);
    }

    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        mbErrorOccured = true;
        showErrorLayout();
        super.onReceivedError(view, errorCode, description, failingUrl);
    }
}

private WebChromeClient getChromeClient() {
    final ProgressDialog progressDialog = new ProgressDialog(MyWebViewActivity.this);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.setCancelable(false);

    return new WebChromeClient() {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);
        }
    };
}

private void showErrorLayout() {
    mlLayoutRequestError.setVisibility(View.VISIBLE);
}

private void hideErrorLayout() {
    mhErrorLayoutHide.sendEmptyMessageDelayed(10000, 200);
}

private Handler getErrorLayoutHideHandler() {
    return new Handler() {
        @Override
        public void handleMessage(Message msg) {
            mlLayoutRequestError.setVisibility(View.GONE);
            super.handleMessage(msg);
        }
    };
}

}

答案 1 :(得分:0)

试试这个......这是由AS生成的AS默认webview活动的代码。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.google);
    initInstances();

    WebView myWebView = (WebView) findViewById(R.id.webView1);
    myWebView.getSettings().setJavaScriptEnabled(true);
    myWebView.loadUrl("http://www.google.com");
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    myWebView.setWebViewClient(new WebViewClient());

}

旁注: - >> iinitInstances()指的是左侧的nagivation抽屉,可以忽略。