WebView无法正常工作

时间:2014-03-21 01:06:37

标签: java android webview

在我简单的Android应用程序中,我有一个webview填满了屏幕的一半。我现在要做的就是加载一个网页。问题是每当我运行我的应用程序时它说网页不可用。然后,如果我点击链接( https://www.google.com/ ),则说明 https://www.google.com/ 的网页可能会暂时关闭,或者可能已永久移动到一个新的地址,它将打开浏览器并毫无问题地进入网站。以下是一些代码:

MainActivity.java:

package com.example.tscschools;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends Activity {

    private WebView webView;

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

        webView = (WebView) findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebChromeClient(new WebChromeClient());
        webView.loadUrl("https://www.google.com/");

    }

}

activity_main.xml中:

   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <WebView 
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="210dp" />

</RelativeLayout>

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.jackson"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.android.jackson.MainActivity"
            android:label="@string/app_name" 
            android:hardwareAccelerated="true" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我在运行android 4.0+或4.4(运行4.4.2)时听说过,它可能会导致webview出现问题?我不确定那是不是导致问题的原因,但我想我可能会把它扔出去。我真的希望看到这个的人能解决它!谢谢!

5 个答案:

答案 0 :(得分:1)

您需要实施WebViewClient,例如:

 webView.loadUrl("https://www.google.com/"); 
 webView.setWebViewClient(new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);  
            return true;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);

        }

        @Override
        public void onPageFinished(WebView view, String url) {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);
        }

    });

在您的情况下,您必须实施WebChromeClient,而WebChromeClient用于处理由JavaScript生成的Android应用中的WebView个事件。此类事件的例子如下:

onCloseWindow
onProgressChanged
onJsAlert
onJsConfirm
onJsPrompt
onJsTimeout

答案 1 :(得分:0)

尝试使用以下内容更改webView.setWebChromeClient(new WebChromeClient());行,以确保您没有收到SSL错误:

webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        Log.w("webView", "Encountered an SSL error");
        // handler.proceed();
    }
});

您可以通过取消注释handler.proceed();行来忽略SSL错误,但实际解决SSL问题会更好。

答案 2 :(得分:0)

从您的代码中我可以看到您没有为您的webview定义WebViewClient。您刚刚添加了WebChromeClient。

在你的oncreate()

中添加这一行
webView.setWebViewClient(new WebViewClient());

答案 3 :(得分:0)

您应该像这样为您的浏览器实现WebViewClient和setContentView     web.setWebViewClient(new myWebClient());     web.setWebChromeClient(new WebChromeClient());     的setContentView(网页);

package com.example.yourappname;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.ValueCallback;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

WebView web;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    web = (WebView) findViewById(R.id.webView1);
    web = new WebView(this);  
    web.getSettings().setJavaScriptEnabled(true);
    web.loadUrl("http://www.yoururlhere.com");
    web.setWebViewClient(new myWebClient());
    web.setWebChromeClient(new WebChromeClient());
    setContentView(web);
}



public class myWebClient extends WebViewClient
{
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        // TODO Auto-generated method stub
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // TODO Auto-generated method stub

        view.loadUrl(url);
        return true;

    }
    
    @Override
    public void onPageFinished(WebView view, String url) {
        // TODO Auto-generated method stub
        super.onPageFinished(view, url);

        
    }
}

//flip screen not loading again
@Override
public void onConfigurationChanged(Configuration newConfig){        
  super.onConfigurationChanged(newConfig);
}





@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(event.getAction() == KeyEvent.ACTION_DOWN){
        switch(keyCode)
        {
        case KeyEvent.KEYCODE_BACK:
            if(web.canGoBack()){
             	web.goBack();
             }
            else
            {
            	backButtonHandler();
            }
            return true;
        }

     }
     return super.onKeyDown(keyCode, event);
 }
public void backButtonHandler() {
		AlertDialog.Builder alertDialog = new AlertDialog.Builder(
				MainActivity.this);
		
	
		// Setting Dialog Title
	   // Setting Dialog Message
		
		alertDialog.setTitle("Alert Dialog Title Here");
		alertDialog.setIcon(R.drawable.dialog_icon);
		alertDialog.setMessage("Exit Now?");
		
	     // Setting Icon to Dialog
		// Setting Positive "Yes" Button
		
		alertDialog.setPositiveButton("Exit",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						finish();
					}
		});
		
	// Setting Negative "NO" Button
		
		alertDialog.setNegativeButton("No",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						// Write your code here to invoke NO event
						dialog.cancel();
					}
				});
	// Showing Alert Message
		alertDialog.show();
}

}

答案 4 :(得分:0)

你应该实现一个&#34; WebViewClient&#34;和&#34; setContentView&#34;在你的onCreate(Bundle savedInstanceState)里面或下面&#34; webView.loadUrl&#34;,就像这样:

web.setWebViewClient(new myWebClient());
web.setWebChromeClient(new WebChromeClient());
setContentView(web);

你完成了。一切顺利..