工作中用到了webview下面把webview相关的知识进行一下总结
:
首先要在manifest.main文件中创建一个webview,然后再activity中定义这个webview然后进行一下相关操作。
1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web pagenot available错误。
2、在要Activity中生成一个WebView组件:WebView webView = newWebView(this);
3、设置WebView基本信息:
如果访问的页面中有Javascript,则webview必须设置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true);
触摸焦点起作用
requestFocus();
取消滚动条
this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
4如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。给WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法 shouldOverrideUrlLoading:对网页中超链接按钮的响应。 当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
这里还有几个知识点:
1)为了让WebView从apk文件中加载 assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html"
2)addJavascriptInterface方法中要绑定的 Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用Handler的目的。
Webview的两种显示网页的方法:
(1):webview.loadUrl(“ www.baidu.com”);
public class WebviewTest extendsActivity {
/** Called whenthe activity is first created. */
private WebView mWebView;
private Button bt1;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. main);
mWebView =(WebView)findViewById(R.id. webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled( true);
bt1 = (Button)findViewById(R.id. Button01);
bt1.setOnClickListener( new View.OnClickListener() {
publicvoidonClick(View arg0) {
// TODO Auto-generated method stub
webview.loadUrl(“ www.baidu.com”);
}
});
}
}
(2):自定义网页:Webview.data();
public class WebviewTest extendsActivity {
/** Called whenthe activity is first created. */
private WebView mWebView;
private Button bt1;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. main);
mWebView =(WebView)findViewById(R.id. webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled( true);
bt1 = (Button)findViewById(R.id. Button01);
bt1.setOnClickListener( new View.OnClickListener() {
publicvoidonClick(View arg0) {
// TODO Auto-generated method stub
Stringstr = "asdas";
mWebView.loadData(
"<html><body>"+str+ "</body></html>",
"text/html", "utf-8");
}
});
}
}
Webview的常用方法实例:
Manifest.xml中的代码:
加入权限:
< uses-permission android:name= "android.permission.INTERNET" />
布局文件中的代码:
<? xml version= "1.0" encoding= "utf-8"?>
< LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:orientation= "vertical" android:layout_width= "fill_parent"
android:layout_height= "fill_parent">
< WebView android:id= "@+id/WebView01" android:layout_width= "fill_parent"
android:layout_height= "fill_parent"></ WebView>
</LinearLayout>
TestWebviewDemo中的代码:
public class TestWebviewDemo extends Activity {
/** Calledwhen the activity is first created. */
privatestaticfinalString TAG = "TestWebviewDemo";
privateWebView mWebView;
privateHandler mHandler = new Handler();
privateint mDensity;
publicvoid onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. main);
mWebView= (WebView) findViewById(R.id. WebView01);
mWebView.getSettings().setAllowFileAccess( true); // 设置允许访问文件数据
mWebView.getSettings().setBuiltInZoomControls( true); // 设置支持缩放
mWebView.getSettings().setSavePassword( false); // 设置是否保存密码
// 设置支持 JavaScript 脚本
mWebView.getSettings().setJavaScriptEnabled( true);
// 设置支持各种不同的设备
mWebView
.getSettings()
.setUserAgentString(
"Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X;en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334bSafari/531.21.10");
// 通过这个设置来执行加载 webview 网页时所要执行的一些方法
mWebView.setWebViewClient( new WebViewClient() {
// 新开页面时用自己定义的 webview 来显示,不用系统自带的浏览器来显示
public booleanshouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
// 当有新连接时使用当前的 webview 进行显示
view.loadUrl(url);
returnsuper.shouldOverrideUrlLoading(view,url);
}
// 开始加载网页时要做的工作
public voidonPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
// 加载完成时要做的工作
public voidonPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
// 加载错误时要做的工作
public voidonReceivedError(WebView view, interrorCode,
Stringdescription, String failingUrl) {
Log. d( TAG, "error="+ description);
Toast. makeText(TestWebviewDemo. this,
errorCode+ "/" + description, Toast. LENGTH_LONG)
.show();
}
});
// 处理网页中的一些对话框信息(提示对话框,带选择的对话框,带输入的对话框)
mWebView.setWebChromeClient( new WebChromeClient() {
// 对话框
public booleanonJsAlert(WebView view, String url, String message,
final JsResult result) {
// 构建一个 Builder 来显示网页中的 alert 对话框
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 提示对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setCancelable( false);//设置为false,按返回键不能退出。默认为true。
builder.create();
builder.show();
returntrue;
}
// 带按钮的对话框
public booleanonJsConfirm(WebView view, String url,
Stringmessage, final JsResult result) {
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 带选择的对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setNeutralButton(android.R.string. cancel,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.setCancelable( false);
builder.create();
builder.show();
returntrue;
}
// 带输入框的对话框
public booleanonJsPrompt(WebView view, String url, String message,
StringdefaultValue, final JsPromptResultresult) {
LayoutInflaterinflater = LayoutInflater
. from(TestWebviewDemo. this);
final View v = inflater.inflate(R.layout. prom_dialog, null);
// 设置 TextView 对应网页中的提示信息
((TextView)v.findViewById(R.id. TextView_PROM))
.setText(message);
// 设置 EditText 对应网页中的输入框
((EditText)v.findViewById(R.id. EditText_PROM))
.setText(defaultValue);
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 带输入的对话框 ");
builder.setView(v);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Stringvalue = ((EditText) v
.findViewById(R.id. EditText_PROM))
.getText().toString();
result.confirm(value);
}
});
builder.setNegativeButton(android.R.string. cancel,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder
.setOnCancelListener( new DialogInterface.OnCancelListener() {
@Override
publicvoidonCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.create();
builder.show();
returntrue;
}
// 设置网页加载的进度条
public voidonProgressChanged(WebView view, intnewProgress) {
TestWebviewDemo. this.getWindow().setFeatureInt(
Window. FEATURE_PROGRESS, newProgress * 100);
super.onProgressChanged(view, newProgress);
}
// 设置应用程序的标题
public voidonReceivedTitle(WebView view, String title) {
TestWebviewDemo. this.setTitle(title);
super.onReceivedTitle(view, title);
}
});
// 与网页进行交互的addJavascriptInterface()的方法
mWebView.addJavascriptInterface( new Object() {
public void clickOnAndroid(final String str){
mHandler.post( newRunnable() {
@Override
publicvoidrun() {
// 逻辑代码
});
}
}, "demo");
if( mDensity == 240) { // 可以让不同的 density 的情况下,可以让页面进行适配
mWebView.getSettings().setDefaultZoom(ZoomDensity. FAR);
} elseif ( mDensity== 160) {
mWebView.getSettings().setDefaultZoom(ZoomDensity. MEDIUM);
} else{
mWebView.getSettings().setDefaultZoom(ZoomDensity. CLOSE);
}
String strUrl = "http://10.0.2.2:8080/WebTest3";
mWebView.loadUrl(strUrl);
}
// 处理返回的事件,(后退进入前一个界面而不是全部退出)
@Override
publicboolean onKeyDown( int keyCode, KeyEvent event) {
if(keyCode == KeyEvent. KEYCODE_BACK&& mWebView.canGoBack()) {
mWebView.goBack(); // 返回前一个页面
return true;
}
returnsuper.onKeyDown(keyCode, event);
}
Webview中java与网页进行数据交互:
先看我们的html文档:
<html>
<script language="javascript">
/* This function is invoked by the activity */
function wave() {
alert("1");
document.getElementById("droid").src="android_waving.png";
alert("2");
}
</script>
<body>
<!-- Calls into the javascript interface for the activity -->
//js 调用 Java 方法
<a><divstyle="width:80px;
margin:0px auto;
padding:10px;
text-align:center;
border:2px solid #202020;" >
<img id="droid"src="android_normal.png"/><br>
Click me!
</div></a>
</body>
</html>
Manifest.Xml中:
加入权限:
< uses-permission android:name= "android.permission.INTERNET" />
再看我们的java 代码。
Java代码
public class WebViewDemo extends Activity{
private static final String LOG_TAG = "WebViewDemo";
private WebView mWebView;
private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
mWebView.setWebChromeClient(new MyWebChromeClient());
// 自定义的 Demo ,供 js 网页调用
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(),"demo");
mWebView.loadUrl("file:///android_asset/demo.html");
}
final class DemoJavaScriptInterface {
DemoJavaScriptInterface() {
}
/**
* This is not called on the UI thread. Post a runnable to invoke
* loadUrl on the UI thread.
*/
public void clickOnAndroid() {
// 用 handler 来更新 UI
mHandler.post(new Runnable() {
public void run() {
//Java 调用 js 方法
mWebView.loadUrl("javascript:wave()");
}
});
}
}
/**
* Provides a hook for calling "alert" from javascript. Usefulfor
* debugging your javascript.
*/
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message,JsResult result) {
Log.d(LOG_TAG, message);
result.confirm();
return true;
}
}
}
再看个例子:
Html中的代码:
<script type= "text/JavaScript" >
functions() {
alert( "Good Morning!");
}
functiond() {
confirm( "Are you ok?")
}
functionf() {
prompt( "What’s yourname?")
}
</script >
</head >
<body >
<body >
下面我们演示三种对话框
<br /><br />
<input type= "button" value= " 警告,提醒对话框 " onclick= "s()" >
<br /><br />
<input type= "button" value= " 带选择的对话框 " onclick= "d()" >
<br /><br />
<input type= "button" value= " 要求用户输入的对话框 " onclick= "f()" >
</body >
Manifest.Xml中:
加入权限:
< uses-permission android:name= "android.permission.INTERNET" />
Java中的代码:
public class Test extendsActivity {
/** Called whenthe activity is first created. */
privateEditText et = null;
privateButton btn = null;
privateWebView wv = null;
privateWebSettings ws = null;
@Override
publicvoid onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. main);
et =(EditText) this.findViewById(R.id. EditText01);
btn= (Button) this.findViewById(R.id. Button01);
wv =(WebView) this.findViewById(R.id. WebView);
ws = wv.getSettings();
ws.setAllowFileAccess( true); // 设置允许访问文件数据
ws.setJavaScriptEnabled( true); // 设置支持 javascript 脚本
ws.setBuiltInZoomControls( true); // 设置支持缩放
wv.requestFocus();
wv.setWebViewClient( new WebViewClient(){
publicbooleanshouldOverrideUrlLoading(WebView view,String url){
// 当有新连接时,使用当前的 WebView
view.loadUrl(url);
returntrue;
}
});
wv.setWebChromeClient( new WebChromeClient(){
publicboolean onJsAlert(WebView view,Stringurl,String message, final JsResultresult){
// 构建一个 Builder 来显示网页中的 alert 对话框
Builder builder = new Builder(Test. this);
builder.setTitle( " 提示对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok, newAlertDialog.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setCancelable( false);
builder.create();
builder.show();
returntrue;
}
publicboolean onJsConfirm(WebViewview,String url,String message, finalJsResult result){
Builder builder = new Builder(Test. this);
builder.setTitle( " 带选择的对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok, newAlertDialog.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setNeutralButton(android.R.string. cancel, newAlertDialog.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.setCancelable( false);
builder.create();
builder.show();
returntrue;
}
publicboolean onJsPrompt(WebViewview,String url,String message,String defaultValue, finalJsPromptResult result){
LayoutInflater inflater =LayoutInflater. from(Test. this);
finalView v = inflater.inflate(R.layout. prom_dialog, null);
// 设置 TextView 对应网页中的提示信息
((TextView)v.findViewById(R.id. TextView_PROM)).setText(message);
// 设置 EditText 对应网页中的输入框
((EditText)v.findViewById(R.id. EditText_PROM)).setText(defaultValue);
Builder builder = new Builder(Test. this);
builder.setTitle( " 带输入的对话框 ");
builder.setView(v);
builder.setPositiveButton(android.R.string. ok, newAlertDialog.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
String value =((EditText)v.findViewById(R.id. EditText_PROM)).getText().toString();
result.confirm(value);
}
});
builder.setNegativeButton(android.R.string. cancel, newAlertDialog.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.setOnCancelListener( new DialogInterface.OnCancelListener(){
@Override
publicvoid onCancel(DialogInterface dialog){
// TODO Auto-generated method stub
result.cancel();
}
});
builder.create();
builder.show();
returntrue;
}
// 设置网页加载的进度条
publicvoid onProgressChanged(WebView view, int newProgress){
Test. this.getWindow().setFeatureInt(Window. FEATURE_PROGRESS, newProgress*100);
super.onProgressChanged(view,newProgress);
}
// 设置应用程序的标题
publicvoid onReceivedTitle(WebViewview,String title){
Test. this.setTitle(title);
super.onReceivedTitle(view,title);
}
});
btn.setOnClickListener( new Button.OnClickListener(){
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
String url = et.getText().toString();
// Stringurl = "http://10.0.2.2:8080/WebTest3";
// 判断输入的内容是不是网址
if(URLUtil. isNetworkUrl(url)){
Log. d( "++++++++++++", "sadas");
wv.loadUrl(url);
Toast. makeText(Test. this, url, Toast. LENGTH_SHORT).show();
} else{
et.setHint( " 输入的网址不合法,请重新输入 ");
// et.setText(" 输入的网址不合法,请重新输入 ");
}
}
});
}
@Override
publicboolean onKeyDown( int keyCode, KeyEvent event) {
if(keyCode==KeyEvent. KEYCODE_BACK && wv.canGoBack()){
wv.goBack(); // 返回前一个页面
returntrue;
}
returnsuper.onKeyDown(keyCode, event);
}
}
需要注意的地方,很多数据类型js中不认识,最好是在android那边封装好,提供必要的方法接口。比如传到js中的list,在js中是没办法去得到里面的元素的。
Manifest.Xml中:
加入权限:
< uses-permission android:name= "android.permission.INTERNET" />
html的带码
<script language="javascript">
window.οnlοad= function(){
vari=window.javatojs.getSize();
for(varn=0;n<i;n++){
var jsdata=window.javatojs.getObject(n);//拿到activity里面的属性javadata
var datalistdiv = document.getElementById("datalist"); //得到页面的div
pnode = document.createElement("p");//创建一个p标签,再建个textnode
tnode = document.createTextNode(jsdata);
pnode.appendChild(tnode);//p中加入数据
datalistdiv.appendChild(pnode);//div中键入新的p
}
}
</script>
<body>
<div id = "datalist">
this is a demo
</body>
Java的代码:
public class JavaToWebview extends Activity{
private WebView web;
public List list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initData();
setContentView(R.layout.webview);
web = (WebView)this.findViewById(R.id.webview);
web.getSettings().setJavaScriptEnabled(true);//开启javascript设置
web.addJavascriptInterface(this, "javatojs");//把RIAExample的一个实例添加到js的全局对象window中, //这样就可以使用window.javatojs来调用它的方法
web.loadUrl("file:///android_asset/demo5.html");//加载网页
}
void initData(){
list=newArrayList<String>();
for(int i=0;i<5;i++){
list.add("我是从数据库中读取的哈哈");
}
}
/**
* 该方法将在js脚本中,通过window.javatojs.....()进行调用
* @return
*/
public Object getObject(int index){
return list.get(index);
}
public int getSize(){
return list.size();
}
}
再看一个查地图的例子:
Manifest.Xml中:
加入权限:
< uses-permission android:name= "android.permission.INTERNET" />
布局文件中的代码:
<?xml version="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Welcome to Mr Wei's Blog."
/>
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change the webview content"
/>
</LinearLayout>
在assets目录下新建一个demo.html文件,代码如下:
<html>
<scriptlanguage="javascript"><!--
function fillContent(){
document.getElementById("content").innerHTML =
"This Content is showedby Android invoke Javascript function.";
}
// --></script>
<body>
<p><ahref="">Start GoogleMap</a></p>
<p id="content"></p>
<p>A Demo ----Android and Javascript invoke eachother.</p>
<p>Author:Frankiewei</p>
</body>
</html>
activity代码:
public class WebViewDemo extends Activity{
private WebView mWebView;
private Button mButton;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
//初始化
private void setupViews() {
mWebView = (WebView) findViewById(R.id.webview);
WebSettings mWebSettings =mWebView.getSettings();
//加上这句话才能使用javascript方法
mWebSettings.setJavaScriptEnabled(true);
//增加接口方法,让html页面调用
mWebView.addJavascriptInterface(new Object() {
//这里我定义了一个打开地图应用的方法
public void startMap() {
Intent mIntent = newIntent();
ComponentName component = newComponentName(
"com.google.android.apps.maps",
"com.google.android.maps.MapsActivity");
mIntent.setComponent(component);
startActivity(mIntent);
}
}, "demo");
//加载页面
mWebView.loadUrl("file:///android_asset/demo.html");
mButton = (Button) findViewById(R.id.button);
//给button添加事件响应,执行JavaScript的fillContent()方法
mButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
mWebView.loadUrl("javascript:fillContent()");
}
});
}
}
其他例子如下:(activity中获取js界面输入框的值)
Jsp中的代码:
<body >
<form action= "" method= "post" >
宝宝预产期: <br >
<select id= "shijian" name= "date" >
<option value= "2006" >2006 </option >
<option value= "2007" >2007 </option >
<option value= "2008" >2008 </option >
<option value= "2009" >2009 </option >
<option value= "2010" >2010 </option >
</select ><br >
常用邮箱号:
<input id= "email" type= "text" name= "emailID" />
<br >
宝宝昵称:
<input id= "name" type= "text" name= "username" />
<br >
宝宝性别: <br >
<input id= "men" type= "radio" name= "sex" value= "men" />男
<input id= "women" type= "radio" name= "sex" value= "women" />女
<br >
<input type= "submit" value= " 注册 "
onclick= "f()" />
<input type= "button" value= " 取消 " />
</form >
</body >
<script type= "text/JavaScript" language= "javascript" >
functionf() {
var email= document.getElementById( 'email').value;
var name =document.getElementById( 'name').value;
var date =document.getElementById( 'shijian').value;
if(document.getElementById( 'men').checked &&!document.getElementById( 'women').checked) {
var sex= document.getElementById( 'men').value;
}elseif(!document.getElementById( 'men').checked &&document.getElementById( 'women').checked) {
var sex= document.getElementById( 'women').value;
}
window.demo.clickOnAndroid(date+ "|"+email+ "|"+name+ "|"+sex);
}
</script >
Manifest.xml中的代码:
<? xml version= "1.0" encoding= "utf-8"?>
< manifest xmlns:android= "http://schemas.android.com/apk/res/android"
package= "com.ruixin.login" android:versionCode= "1" android:versionName= "1.0">
< application android:icon= "@drawable/icon" android:label= "@string/app_name">
< activity android:name= ".TestWebviewDemo" android:label= "@string/app_name">
< intent-filter>
< action android:name= "android.intent.action.MAIN" />
< category android:name= "android.intent.category.LAUNCHER"/>
</ intent-filter>
< intent-filter>
< data android:mimeType= "vnd.android.cursor.dir/vnd.ruixin.login"/>
</ intent-filter>
< intent-filter>
< data android:mimeType= "vnd.android.cursor.item/vnd.ruixin.login"/>
</ intent-filter>
</ activity>
< provider android:name= "MyProvider" android:authorities= "com.ruixin.login" />
</ application>
< uses-sdk android:minSdkVersion= "8" />
< uses-permission android:name= "android.permission.INTERNET" />
< uses-permission android:name= "android.permission.READ_CONTACTS"></ uses-permission>
</ manifest>
布局文件中的代码:
<? xml version= "1.0" encoding= "utf-8"?>
< LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:orientation= "vertical" android:layout_width= "fill_parent"
android:layout_height= "fill_parent">
< WebView android:id= "@+id/WebView01" android:layout_width= "fill_parent"
android:layout_height= "fill_parent"></ WebView>
</LinearLayout>
TestWebviewDemo中的代码:
public class TestWebviewDemo extends Activity {
/** Calledwhen the activity is first created. */
privatestaticfinalString TAG = "TestWebviewDemo";
privateWebView mWebView;
privateHandler mHandler = new Handler();
privateint mDensity;
publicvoid onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. main);
mWebView= (WebView) findViewById(R.id. WebView01);
mWebView.getSettings().setAllowFileAccess( true); // 设置允许访问文件数据
mWebView.getSettings().setBuiltInZoomControls( true); // 设置支持缩放
mWebView.getSettings().setSavePassword( false); // 设置是否保存密码
// 设置支持 JavaScript 脚本
mWebView.getSettings().setJavaScriptEnabled( true);
// 设置支持各种不同的设备
mWebView
.getSettings()
.setUserAgentString(
"Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X;en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334bSafari/531.21.10");
// 通过这个设置来执行加载 webview 网页时所要执行的一些方法
mWebView.setWebViewClient( new WebViewClient() {
// 新开页面时用自己定义的 webview 来显示,不用系统自带的浏览器来显示
public booleanshouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
// 当有新连接时使用当前的 webview 进行显示
view.loadUrl(url);
returnsuper.shouldOverrideUrlLoading(view,url);
}
// 开始加载网页时要做的工作
public voidonPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view,url, favicon);
}
// 加载完成时要做的工作
public voidonPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
// 加载错误时要做的工作
public voidonReceivedError(WebView view, interrorCode,
Stringdescription, String failingUrl) {
Log. d( TAG, "error="+ description);
Toast. makeText(TestWebviewDemo. this,
errorCode+ "/" + description, Toast. LENGTH_LONG)
.show();
}
});
// 处理网页中的一些对话框信息(提示对话框,带选择的对话框,带输入的对话框)
mWebView.setWebChromeClient( new WebChromeClient() {
// 对话框
public booleanonJsAlert(WebView view, String url, String message,
final JsResult result) {
// 构建一个 Builder 来显示网页中的 alert 对话框
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 提示对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setCancelable( false);
builder.create();
builder.show();
returntrue;
}
// 带按钮的对话框
public booleanonJsConfirm(WebView view, String url,
Stringmessage, final JsResult result) {
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 带选择的对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setNeutralButton(android.R.string. cancel,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.setCancelable( false);
builder.create();
builder.show();
returntrue;
}
// 带输入框的对话框
public booleanonJsPrompt(WebView view, String url, String message,
StringdefaultValue, final JsPromptResultresult) {
LayoutInflaterinflater = LayoutInflater
. from(TestWebviewDemo. this);
final View v = inflater.inflate(R.layout. prom_dialog, null);
// 设置 TextView 对应网页中的提示信息
((TextView)v.findViewById(R.id. TextView_PROM))
.setText(message);
// 设置 EditText 对应网页中的输入框
((EditText)v.findViewById(R.id. EditText_PROM))
.setText(defaultValue);
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 带输入的对话框 ");
builder.setView(v);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Stringvalue = ((EditText) v
.findViewById(R.id. EditText_PROM))
.getText().toString();
result.confirm(value);
}
});
builder.setNegativeButton(android.R.string. cancel,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder
.setOnCancelListener( new DialogInterface.OnCancelListener() {
@Override
publicvoidonCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.create();
builder.show();
returntrue;
}
// 设置网页加载的进度条
public voidonProgressChanged(WebView view, intnewProgress) {
TestWebviewDemo. this.getWindow().setFeatureInt(
Window. FEATURE_PROGRESS, newProgress * 100);
super.onProgressChanged(view, newProgress);
}
// 设置应用程序的标题
public voidonReceivedTitle(WebView view, String title) {
TestWebviewDemo. this.setTitle(title);
super.onReceivedTitle(view, title);
}
});
// 与网页进行交互的addJavascriptInterface()的方法
mWebView.addJavascriptInterface( new Object() {
public void clickOnAndroid(final String str){
mHandler.post( newRunnable() {
@Override
publicvoidrun() {
StringTokenizerstringTokenizer = newStringTokenizer(
str, "|");
date = stringTokenizer.nextToken();
email = stringTokenizer.nextToken();
username = stringTokenizer.nextToken();
sex = stringTokenizer.nextToken();
// 将数据出入数据库
dBlite1.add( email, username, date, sex);
// 用 contentResolver 访问存入到 contentprovider 中的数据
contentResolver = TestWebviewDemo. this
.getContentResolver();
Log. d( "++++", RuiXin. CONTENT_URI.toString());
Cursorcursor = contentResolver.query(
RuiXin. CONTENT_URI, newString[] {
RuiXin. EMAIL, RuiXin. USERNAME,
RuiXin. DATE,RuiXin. SEX}, null, null, null);
Log. d( "@@@----", cursor.toString());
// startManagingCursor(cursor);
while (cursor.moveToNext()) {
Toast. makeText(
TestWebviewDemo. this,
cursor.getString(cursor.getColumnIndex(RuiXin. EMAIL))
+ " "
+cursor.getString(cursor
.getColumnIndex(RuiXin. USERNAME))
+ " "
+cursor.getString(cursor
.getColumnIndex(RuiXin. DATE))
+ " "
+ cursor.getString(cursor
.getColumnIndex(RuiXin. SEX)),
Toast. LENGTH_SHORT).show();
}
startManagingCursor(cursor); // 关闭游标
}
});
}
}, "demo");
if( mDensity == 240) { // 可以让不同的 density 的情况下,可以让页面进行适配
mWebView.getSettings().setDefaultZoom(ZoomDensity. FAR);
} elseif ( mDensity== 160) {
mWebView.getSettings().setDefaultZoom(ZoomDensity. MEDIUM);
} else{
mWebView.getSettings().setDefaultZoom(ZoomDensity. CLOSE);
}
String strUrl = "http://10.0.2.2:8080/WebTest3";
mWebView.loadUrl(strUrl);
}
// 处理返回的事件,(后退进入前一个界面而不是全部退出)
@Override
publicboolean onKeyDown( int keyCode, KeyEvent event) {
if(keyCode == KeyEvent. KEYCODE_BACK&& mWebView.canGoBack()) {
mWebView.goBack(); // 返回前一个页面
return true;
}
returnsuper.onKeyDown(keyCode, event);
}
首先要在manifest.main文件中创建一个webview,然后再activity中定义这个webview然后进行一下相关操作。
1、添加权限:AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web pagenot available错误。
2、在要Activity中生成一个WebView组件:WebView webView = newWebView(this);
3、设置WebView基本信息:
如果访问的页面中有Javascript,则webview必须设置支持Javascript。
webview.getSettings().setJavaScriptEnabled(true);
触摸焦点起作用
requestFocus();
取消滚动条
this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
4如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。给WebView添加一个事件监听对象(WebViewClient)并重写其中的一些方法 shouldOverrideUrlLoading:对网页中超链接按钮的响应。 当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url
onLoadResource
onPageStart
onPageFinish
onReceiveError
onReceivedHttpAuthRequest
5
、如果访问的页面中有
Javascript
,则
webview
必须设置支持
Javascript
,否则显示空白页面。
Java
代码
webview
.getSettings().setJavaScriptEnabled(
true
);
6 、如果页面中链接,如果希望点击链接继续在当前 browser 中响应,而不是新开 Android 的系统 browser 中响应该链接,必须覆盖 webview 的 WebViewClient 对象:
6 、如果页面中链接,如果希望点击链接继续在当前 browser 中响应,而不是新开 Android 的系统 browser 中响应该链接,必须覆盖 webview 的 WebViewClient 对象:
Java
代码
1.
mWebView.setWebViewClient(
new
WebViewClient(){
2.
public boolean shouldOverrideUrlLoading(WebView view, String url) {
3. view.loadUrl(url);
4.
return
true
;
5.
}
6.
});
上述方法告诉系统由我这个
WebViewClient
处理这个
Intent,
我来加载
URL
。点击一个链接的
Intent
是向上冒泡的,
shouldOverrideUrlLoading
方法
return true
表示我加载后这个
Intent
就消费了,不再向上冒泡了。
7 、如果不做任何处理,在显示你的 Brower UI 时,点击系统 “Back” 键,整个 Browser 会作为一个整体 “Back" 到其他 Activity 中,而不是希望的在 Browser 的历史页面中 Back 。如果希望实现在历史页面中 Back ,需要在当前 Activity 中处理并消费掉该 Back 事件:
7 、如果不做任何处理,在显示你的 Brower UI 时,点击系统 “Back” 键,整个 Browser 会作为一个整体 “Back" 到其他 Activity 中,而不是希望的在 Browser 的历史页面中 Back 。如果希望实现在历史页面中 Back ,需要在当前 Activity 中处理并消费掉该 Back 事件:
Java
代码
1.
public boolean onKeyDown(
int keyCode, KeyEvent event) {
2.
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
3. mWebView.goBack();
4.
return
true
;
5.
}
6.
return super.onKeyDown(keyCode, event);
7.
}
对于
Android 2.0
开始又多出了一种新的方法,对于
Activity
可以单独获取
Back
键的按下事件,直接重写
onBackPressed
方法即可,代码如下
Java
代码
@Override
1 、 public void onBackPressed() {
2 、 // 这里处理逻辑代码,该方法仅适用于 2.0 或更高版本的 sdk
3 、 return ;
4 、 }
1 、 public void onBackPressed() {
2 、 // 这里处理逻辑代码,该方法仅适用于 2.0 或更高版本的 sdk
3 、 return ;
4 、 }
这里还有几个知识点:
1)为了让WebView从apk文件中加载 assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html"
2)addJavascriptInterface方法中要绑定的 Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用Handler的目的。
Webview的两种显示网页的方法:
(1):webview.loadUrl(“ www.baidu.com”);
public class WebviewTest extendsActivity {
/** Called whenthe activity is first created. */
private WebView mWebView;
private Button bt1;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. main);
mWebView =(WebView)findViewById(R.id. webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled( true);
bt1 = (Button)findViewById(R.id. Button01);
bt1.setOnClickListener( new View.OnClickListener() {
publicvoidonClick(View arg0) {
// TODO Auto-generated method stub
webview.loadUrl(“ www.baidu.com”);
}
});
}
}
(2):自定义网页:Webview.data();
public class WebviewTest extendsActivity {
/** Called whenthe activity is first created. */
private WebView mWebView;
private Button bt1;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. main);
mWebView =(WebView)findViewById(R.id. webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled( true);
bt1 = (Button)findViewById(R.id. Button01);
bt1.setOnClickListener( new View.OnClickListener() {
publicvoidonClick(View arg0) {
// TODO Auto-generated method stub
Stringstr = "asdas";
mWebView.loadData(
"<html><body>"+str+ "</body></html>",
"text/html", "utf-8");
}
});
}
}
Webview的常用方法实例:
Manifest.xml中的代码:
加入权限:
< uses-permission android:name= "android.permission.INTERNET" />
布局文件中的代码:
<? xml version= "1.0" encoding= "utf-8"?>
< LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:orientation= "vertical" android:layout_width= "fill_parent"
android:layout_height= "fill_parent">
< WebView android:id= "@+id/WebView01" android:layout_width= "fill_parent"
android:layout_height= "fill_parent"></ WebView>
</LinearLayout>
TestWebviewDemo中的代码:
public class TestWebviewDemo extends Activity {
/** Calledwhen the activity is first created. */
privatestaticfinalString TAG = "TestWebviewDemo";
privateWebView mWebView;
privateHandler mHandler = new Handler();
privateint mDensity;
publicvoid onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. main);
mWebView= (WebView) findViewById(R.id. WebView01);
mWebView.getSettings().setAllowFileAccess( true); // 设置允许访问文件数据
mWebView.getSettings().setBuiltInZoomControls( true); // 设置支持缩放
mWebView.getSettings().setSavePassword( false); // 设置是否保存密码
// 设置支持 JavaScript 脚本
mWebView.getSettings().setJavaScriptEnabled( true);
// 设置支持各种不同的设备
mWebView
.getSettings()
.setUserAgentString(
"Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X;en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334bSafari/531.21.10");
// 通过这个设置来执行加载 webview 网页时所要执行的一些方法
mWebView.setWebViewClient( new WebViewClient() {
// 新开页面时用自己定义的 webview 来显示,不用系统自带的浏览器来显示
public booleanshouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
// 当有新连接时使用当前的 webview 进行显示
view.loadUrl(url);
returnsuper.shouldOverrideUrlLoading(view,url);
}
// 开始加载网页时要做的工作
public voidonPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
// 加载完成时要做的工作
public voidonPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
// 加载错误时要做的工作
public voidonReceivedError(WebView view, interrorCode,
Stringdescription, String failingUrl) {
Log. d( TAG, "error="+ description);
Toast. makeText(TestWebviewDemo. this,
errorCode+ "/" + description, Toast. LENGTH_LONG)
.show();
}
});
// 处理网页中的一些对话框信息(提示对话框,带选择的对话框,带输入的对话框)
mWebView.setWebChromeClient( new WebChromeClient() {
// 对话框
public booleanonJsAlert(WebView view, String url, String message,
final JsResult result) {
// 构建一个 Builder 来显示网页中的 alert 对话框
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 提示对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setCancelable( false);//设置为false,按返回键不能退出。默认为true。
builder.create();
builder.show();
returntrue;
}
// 带按钮的对话框
public booleanonJsConfirm(WebView view, String url,
Stringmessage, final JsResult result) {
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 带选择的对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setNeutralButton(android.R.string. cancel,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.setCancelable( false);
builder.create();
builder.show();
returntrue;
}
// 带输入框的对话框
public booleanonJsPrompt(WebView view, String url, String message,
StringdefaultValue, final JsPromptResultresult) {
LayoutInflaterinflater = LayoutInflater
. from(TestWebviewDemo. this);
final View v = inflater.inflate(R.layout. prom_dialog, null);
// 设置 TextView 对应网页中的提示信息
((TextView)v.findViewById(R.id. TextView_PROM))
.setText(message);
// 设置 EditText 对应网页中的输入框
((EditText)v.findViewById(R.id. EditText_PROM))
.setText(defaultValue);
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 带输入的对话框 ");
builder.setView(v);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Stringvalue = ((EditText) v
.findViewById(R.id. EditText_PROM))
.getText().toString();
result.confirm(value);
}
});
builder.setNegativeButton(android.R.string. cancel,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder
.setOnCancelListener( new DialogInterface.OnCancelListener() {
@Override
publicvoidonCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.create();
builder.show();
returntrue;
}
// 设置网页加载的进度条
public voidonProgressChanged(WebView view, intnewProgress) {
TestWebviewDemo. this.getWindow().setFeatureInt(
Window. FEATURE_PROGRESS, newProgress * 100);
super.onProgressChanged(view, newProgress);
}
// 设置应用程序的标题
public voidonReceivedTitle(WebView view, String title) {
TestWebviewDemo. this.setTitle(title);
super.onReceivedTitle(view, title);
}
});
// 与网页进行交互的addJavascriptInterface()的方法
mWebView.addJavascriptInterface( new Object() {
public void clickOnAndroid(final String str){
mHandler.post( newRunnable() {
@Override
publicvoidrun() {
// 逻辑代码
});
}
}, "demo");
if( mDensity == 240) { // 可以让不同的 density 的情况下,可以让页面进行适配
mWebView.getSettings().setDefaultZoom(ZoomDensity. FAR);
} elseif ( mDensity== 160) {
mWebView.getSettings().setDefaultZoom(ZoomDensity. MEDIUM);
} else{
mWebView.getSettings().setDefaultZoom(ZoomDensity. CLOSE);
}
String strUrl = "http://10.0.2.2:8080/WebTest3";
mWebView.loadUrl(strUrl);
}
// 处理返回的事件,(后退进入前一个界面而不是全部退出)
@Override
publicboolean onKeyDown( int keyCode, KeyEvent event) {
if(keyCode == KeyEvent. KEYCODE_BACK&& mWebView.canGoBack()) {
mWebView.goBack(); // 返回前一个页面
return true;
}
returnsuper.onKeyDown(keyCode, event);
}
Webview中java与网页进行数据交互:
先看我们的html文档:
<html>
<script language="javascript">
/* This function is invoked by the activity */
function wave() {
alert("1");
document.getElementById("droid").src="android_waving.png";
alert("2");
}
</script>
<body>
<!-- Calls into the javascript interface for the activity -->
//js 调用 Java 方法
<a><divstyle="width:80px;
margin:0px auto;
padding:10px;
text-align:center;
border:2px solid #202020;" >
<img id="droid"src="android_normal.png"/><br>
Click me!
</div></a>
</body>
</html>
Manifest.Xml中:
加入权限:
< uses-permission android:name= "android.permission.INTERNET" />
再看我们的java 代码。
Java代码
public class WebViewDemo extends Activity{
private static final String LOG_TAG = "WebViewDemo";
private WebView mWebView;
private Handler mHandler = new Handler();
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
mWebView.setWebChromeClient(new MyWebChromeClient());
// 自定义的 Demo ,供 js 网页调用
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(),"demo");
mWebView.loadUrl("file:///android_asset/demo.html");
}
final class DemoJavaScriptInterface {
DemoJavaScriptInterface() {
}
/**
* This is not called on the UI thread. Post a runnable to invoke
* loadUrl on the UI thread.
*/
public void clickOnAndroid() {
// 用 handler 来更新 UI
mHandler.post(new Runnable() {
public void run() {
//Java 调用 js 方法
mWebView.loadUrl("javascript:wave()");
}
});
}
}
/**
* Provides a hook for calling "alert" from javascript. Usefulfor
* debugging your javascript.
*/
final class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message,JsResult result) {
Log.d(LOG_TAG, message);
result.confirm();
return true;
}
}
}
再看个例子:
Html中的代码:
<script type= "text/JavaScript" >
functions() {
alert( "Good Morning!");
}
functiond() {
confirm( "Are you ok?")
}
functionf() {
prompt( "What’s yourname?")
}
</script >
</head >
<body >
<body >
下面我们演示三种对话框
<br /><br />
<input type= "button" value= " 警告,提醒对话框 " onclick= "s()" >
<br /><br />
<input type= "button" value= " 带选择的对话框 " onclick= "d()" >
<br /><br />
<input type= "button" value= " 要求用户输入的对话框 " onclick= "f()" >
</body >
Manifest.Xml中:
加入权限:
< uses-permission android:name= "android.permission.INTERNET" />
Java中的代码:
public class Test extendsActivity {
/** Called whenthe activity is first created. */
privateEditText et = null;
privateButton btn = null;
privateWebView wv = null;
privateWebSettings ws = null;
@Override
publicvoid onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. main);
et =(EditText) this.findViewById(R.id. EditText01);
btn= (Button) this.findViewById(R.id. Button01);
wv =(WebView) this.findViewById(R.id. WebView);
ws = wv.getSettings();
ws.setAllowFileAccess( true); // 设置允许访问文件数据
ws.setJavaScriptEnabled( true); // 设置支持 javascript 脚本
ws.setBuiltInZoomControls( true); // 设置支持缩放
wv.requestFocus();
wv.setWebViewClient( new WebViewClient(){
publicbooleanshouldOverrideUrlLoading(WebView view,String url){
// 当有新连接时,使用当前的 WebView
view.loadUrl(url);
returntrue;
}
});
wv.setWebChromeClient( new WebChromeClient(){
publicboolean onJsAlert(WebView view,Stringurl,String message, final JsResultresult){
// 构建一个 Builder 来显示网页中的 alert 对话框
Builder builder = new Builder(Test. this);
builder.setTitle( " 提示对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok, newAlertDialog.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setCancelable( false);
builder.create();
builder.show();
returntrue;
}
publicboolean onJsConfirm(WebViewview,String url,String message, finalJsResult result){
Builder builder = new Builder(Test. this);
builder.setTitle( " 带选择的对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok, newAlertDialog.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setNeutralButton(android.R.string. cancel, newAlertDialog.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.setCancelable( false);
builder.create();
builder.show();
returntrue;
}
publicboolean onJsPrompt(WebViewview,String url,String message,String defaultValue, finalJsPromptResult result){
LayoutInflater inflater =LayoutInflater. from(Test. this);
finalView v = inflater.inflate(R.layout. prom_dialog, null);
// 设置 TextView 对应网页中的提示信息
((TextView)v.findViewById(R.id. TextView_PROM)).setText(message);
// 设置 EditText 对应网页中的输入框
((EditText)v.findViewById(R.id. EditText_PROM)).setText(defaultValue);
Builder builder = new Builder(Test. this);
builder.setTitle( " 带输入的对话框 ");
builder.setView(v);
builder.setPositiveButton(android.R.string. ok, newAlertDialog.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
String value =((EditText)v.findViewById(R.id. EditText_PROM)).getText().toString();
result.confirm(value);
}
});
builder.setNegativeButton(android.R.string. cancel, newAlertDialog.OnClickListener(){
@Override
publicvoid onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.setOnCancelListener( new DialogInterface.OnCancelListener(){
@Override
publicvoid onCancel(DialogInterface dialog){
// TODO Auto-generated method stub
result.cancel();
}
});
builder.create();
builder.show();
returntrue;
}
// 设置网页加载的进度条
publicvoid onProgressChanged(WebView view, int newProgress){
Test. this.getWindow().setFeatureInt(Window. FEATURE_PROGRESS, newProgress*100);
super.onProgressChanged(view,newProgress);
}
// 设置应用程序的标题
publicvoid onReceivedTitle(WebViewview,String title){
Test. this.setTitle(title);
super.onReceivedTitle(view,title);
}
});
btn.setOnClickListener( new Button.OnClickListener(){
@Override
publicvoid onClick(View v) {
// TODO Auto-generated method stub
String url = et.getText().toString();
// Stringurl = "http://10.0.2.2:8080/WebTest3";
// 判断输入的内容是不是网址
if(URLUtil. isNetworkUrl(url)){
Log. d( "++++++++++++", "sadas");
wv.loadUrl(url);
Toast. makeText(Test. this, url, Toast. LENGTH_SHORT).show();
} else{
et.setHint( " 输入的网址不合法,请重新输入 ");
// et.setText(" 输入的网址不合法,请重新输入 ");
}
}
});
}
@Override
publicboolean onKeyDown( int keyCode, KeyEvent event) {
if(keyCode==KeyEvent. KEYCODE_BACK && wv.canGoBack()){
wv.goBack(); // 返回前一个页面
returntrue;
}
returnsuper.onKeyDown(keyCode, event);
}
}
需要注意的地方,很多数据类型js中不认识,最好是在android那边封装好,提供必要的方法接口。比如传到js中的list,在js中是没办法去得到里面的元素的。
Manifest.Xml中:
加入权限:
< uses-permission android:name= "android.permission.INTERNET" />
html的带码
<script language="javascript">
window.οnlοad= function(){
vari=window.javatojs.getSize();
for(varn=0;n<i;n++){
var jsdata=window.javatojs.getObject(n);//拿到activity里面的属性javadata
var datalistdiv = document.getElementById("datalist"); //得到页面的div
pnode = document.createElement("p");//创建一个p标签,再建个textnode
tnode = document.createTextNode(jsdata);
pnode.appendChild(tnode);//p中加入数据
datalistdiv.appendChild(pnode);//div中键入新的p
}
}
</script>
<body>
<div id = "datalist">
this is a demo
</body>
Java的代码:
public class JavaToWebview extends Activity{
private WebView web;
public List list;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initData();
setContentView(R.layout.webview);
web = (WebView)this.findViewById(R.id.webview);
web.getSettings().setJavaScriptEnabled(true);//开启javascript设置
web.addJavascriptInterface(this, "javatojs");//把RIAExample的一个实例添加到js的全局对象window中, //这样就可以使用window.javatojs来调用它的方法
web.loadUrl("file:///android_asset/demo5.html");//加载网页
}
void initData(){
list=newArrayList<String>();
for(int i=0;i<5;i++){
list.add("我是从数据库中读取的哈哈");
}
}
/**
* 该方法将在js脚本中,通过window.javatojs.....()进行调用
* @return
*/
public Object getObject(int index){
return list.get(index);
}
public int getSize(){
return list.size();
}
}
再看一个查地图的例子:
Manifest.Xml中:
加入权限:
< uses-permission android:name= "android.permission.INTERNET" />
布局文件中的代码:
<?xml version="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Welcome to Mr Wei's Blog."
/>
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Change the webview content"
/>
</LinearLayout>
在assets目录下新建一个demo.html文件,代码如下:
<html>
<scriptlanguage="javascript"><!--
function fillContent(){
document.getElementById("content").innerHTML =
"This Content is showedby Android invoke Javascript function.";
}
// --></script>
<body>
<p><ahref="">Start GoogleMap</a></p>
<p id="content"></p>
<p>A Demo ----Android and Javascript invoke eachother.</p>
<p>Author:Frankiewei</p>
</body>
</html>
activity代码:
public class WebViewDemo extends Activity{
private WebView mWebView;
private Button mButton;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupViews();
}
//初始化
private void setupViews() {
mWebView = (WebView) findViewById(R.id.webview);
WebSettings mWebSettings =mWebView.getSettings();
//加上这句话才能使用javascript方法
mWebSettings.setJavaScriptEnabled(true);
//增加接口方法,让html页面调用
mWebView.addJavascriptInterface(new Object() {
//这里我定义了一个打开地图应用的方法
public void startMap() {
Intent mIntent = newIntent();
ComponentName component = newComponentName(
"com.google.android.apps.maps",
"com.google.android.maps.MapsActivity");
mIntent.setComponent(component);
startActivity(mIntent);
}
}, "demo");
//加载页面
mWebView.loadUrl("file:///android_asset/demo.html");
mButton = (Button) findViewById(R.id.button);
//给button添加事件响应,执行JavaScript的fillContent()方法
mButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
mWebView.loadUrl("javascript:fillContent()");
}
});
}
}
其他例子如下:(activity中获取js界面输入框的值)
Jsp中的代码:
<body >
<form action= "" method= "post" >
宝宝预产期: <br >
<select id= "shijian" name= "date" >
<option value= "2006" >2006 </option >
<option value= "2007" >2007 </option >
<option value= "2008" >2008 </option >
<option value= "2009" >2009 </option >
<option value= "2010" >2010 </option >
</select ><br >
常用邮箱号:
<input id= "email" type= "text" name= "emailID" />
<br >
宝宝昵称:
<input id= "name" type= "text" name= "username" />
<br >
宝宝性别: <br >
<input id= "men" type= "radio" name= "sex" value= "men" />男
<input id= "women" type= "radio" name= "sex" value= "women" />女
<br >
<input type= "submit" value= " 注册 "
onclick= "f()" />
<input type= "button" value= " 取消 " />
</form >
</body >
<script type= "text/JavaScript" language= "javascript" >
functionf() {
var email= document.getElementById( 'email').value;
var name =document.getElementById( 'name').value;
var date =document.getElementById( 'shijian').value;
if(document.getElementById( 'men').checked &&!document.getElementById( 'women').checked) {
var sex= document.getElementById( 'men').value;
}elseif(!document.getElementById( 'men').checked &&document.getElementById( 'women').checked) {
var sex= document.getElementById( 'women').value;
}
window.demo.clickOnAndroid(date+ "|"+email+ "|"+name+ "|"+sex);
}
</script >
Manifest.xml中的代码:
<? xml version= "1.0" encoding= "utf-8"?>
< manifest xmlns:android= "http://schemas.android.com/apk/res/android"
package= "com.ruixin.login" android:versionCode= "1" android:versionName= "1.0">
< application android:icon= "@drawable/icon" android:label= "@string/app_name">
< activity android:name= ".TestWebviewDemo" android:label= "@string/app_name">
< intent-filter>
< action android:name= "android.intent.action.MAIN" />
< category android:name= "android.intent.category.LAUNCHER"/>
</ intent-filter>
< intent-filter>
< data android:mimeType= "vnd.android.cursor.dir/vnd.ruixin.login"/>
</ intent-filter>
< intent-filter>
< data android:mimeType= "vnd.android.cursor.item/vnd.ruixin.login"/>
</ intent-filter>
</ activity>
< provider android:name= "MyProvider" android:authorities= "com.ruixin.login" />
</ application>
< uses-sdk android:minSdkVersion= "8" />
< uses-permission android:name= "android.permission.INTERNET" />
< uses-permission android:name= "android.permission.READ_CONTACTS"></ uses-permission>
</ manifest>
布局文件中的代码:
<? xml version= "1.0" encoding= "utf-8"?>
< LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:orientation= "vertical" android:layout_width= "fill_parent"
android:layout_height= "fill_parent">
< WebView android:id= "@+id/WebView01" android:layout_width= "fill_parent"
android:layout_height= "fill_parent"></ WebView>
</LinearLayout>
TestWebviewDemo中的代码:
public class TestWebviewDemo extends Activity {
/** Calledwhen the activity is first created. */
privatestaticfinalString TAG = "TestWebviewDemo";
privateWebView mWebView;
privateHandler mHandler = new Handler();
privateint mDensity;
publicvoid onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. main);
mWebView= (WebView) findViewById(R.id. WebView01);
mWebView.getSettings().setAllowFileAccess( true); // 设置允许访问文件数据
mWebView.getSettings().setBuiltInZoomControls( true); // 设置支持缩放
mWebView.getSettings().setSavePassword( false); // 设置是否保存密码
// 设置支持 JavaScript 脚本
mWebView.getSettings().setJavaScriptEnabled( true);
// 设置支持各种不同的设备
mWebView
.getSettings()
.setUserAgentString(
"Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X;en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334bSafari/531.21.10");
// 通过这个设置来执行加载 webview 网页时所要执行的一些方法
mWebView.setWebViewClient( new WebViewClient() {
// 新开页面时用自己定义的 webview 来显示,不用系统自带的浏览器来显示
public booleanshouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
// 当有新连接时使用当前的 webview 进行显示
view.loadUrl(url);
returnsuper.shouldOverrideUrlLoading(view,url);
}
// 开始加载网页时要做的工作
public voidonPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view,url, favicon);
}
// 加载完成时要做的工作
public voidonPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
// 加载错误时要做的工作
public voidonReceivedError(WebView view, interrorCode,
Stringdescription, String failingUrl) {
Log. d( TAG, "error="+ description);
Toast. makeText(TestWebviewDemo. this,
errorCode+ "/" + description, Toast. LENGTH_LONG)
.show();
}
});
// 处理网页中的一些对话框信息(提示对话框,带选择的对话框,带输入的对话框)
mWebView.setWebChromeClient( new WebChromeClient() {
// 对话框
public booleanonJsAlert(WebView view, String url, String message,
final JsResult result) {
// 构建一个 Builder 来显示网页中的 alert 对话框
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 提示对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setCancelable( false);
builder.create();
builder.show();
returntrue;
}
// 带按钮的对话框
public booleanonJsConfirm(WebView view, String url,
Stringmessage, final JsResult result) {
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 带选择的对话框 ");
builder.setMessage(message);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.confirm();
}
});
builder.setNeutralButton(android.R.string. cancel,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.setCancelable( false);
builder.create();
builder.show();
returntrue;
}
// 带输入框的对话框
public booleanonJsPrompt(WebView view, String url, String message,
StringdefaultValue, final JsPromptResultresult) {
LayoutInflaterinflater = LayoutInflater
. from(TestWebviewDemo. this);
final View v = inflater.inflate(R.layout. prom_dialog, null);
// 设置 TextView 对应网页中的提示信息
((TextView)v.findViewById(R.id. TextView_PROM))
.setText(message);
// 设置 EditText 对应网页中的输入框
((EditText)v.findViewById(R.id. EditText_PROM))
.setText(defaultValue);
Builderbuilder = newBuilder(TestWebviewDemo. this);
builder.setTitle( " 带输入的对话框 ");
builder.setView(v);
builder.setPositiveButton(android.R.string. ok,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Stringvalue = ((EditText) v
.findViewById(R.id. EditText_PROM))
.getText().toString();
result.confirm(value);
}
});
builder.setNegativeButton(android.R.string. cancel,
new AlertDialog.OnClickListener() {
@Override
publicvoidonClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder
.setOnCancelListener( new DialogInterface.OnCancelListener() {
@Override
publicvoidonCancel(DialogInterface dialog) {
// TODO Auto-generated method stub
result.cancel();
}
});
builder.create();
builder.show();
returntrue;
}
// 设置网页加载的进度条
public voidonProgressChanged(WebView view, intnewProgress) {
TestWebviewDemo. this.getWindow().setFeatureInt(
Window. FEATURE_PROGRESS, newProgress * 100);
super.onProgressChanged(view, newProgress);
}
// 设置应用程序的标题
public voidonReceivedTitle(WebView view, String title) {
TestWebviewDemo. this.setTitle(title);
super.onReceivedTitle(view, title);
}
});
// 与网页进行交互的addJavascriptInterface()的方法
mWebView.addJavascriptInterface( new Object() {
public void clickOnAndroid(final String str){
mHandler.post( newRunnable() {
@Override
publicvoidrun() {
StringTokenizerstringTokenizer = newStringTokenizer(
str, "|");
date = stringTokenizer.nextToken();
email = stringTokenizer.nextToken();
username = stringTokenizer.nextToken();
sex = stringTokenizer.nextToken();
// 将数据出入数据库
dBlite1.add( email, username, date, sex);
// 用 contentResolver 访问存入到 contentprovider 中的数据
contentResolver = TestWebviewDemo. this
.getContentResolver();
Log. d( "++++", RuiXin. CONTENT_URI.toString());
Cursorcursor = contentResolver.query(
RuiXin. CONTENT_URI, newString[] {
RuiXin. EMAIL, RuiXin. USERNAME,
RuiXin. DATE,RuiXin. SEX}, null, null, null);
Log. d( "@@@----", cursor.toString());
// startManagingCursor(cursor);
while (cursor.moveToNext()) {
Toast. makeText(
TestWebviewDemo. this,
cursor.getString(cursor.getColumnIndex(RuiXin. EMAIL))
+ " "
+cursor.getString(cursor
.getColumnIndex(RuiXin. USERNAME))
+ " "
+cursor.getString(cursor
.getColumnIndex(RuiXin. DATE))
+ " "
+ cursor.getString(cursor
.getColumnIndex(RuiXin. SEX)),
Toast. LENGTH_SHORT).show();
}
startManagingCursor(cursor); // 关闭游标
}
});
}
}, "demo");
if( mDensity == 240) { // 可以让不同的 density 的情况下,可以让页面进行适配
mWebView.getSettings().setDefaultZoom(ZoomDensity. FAR);
} elseif ( mDensity== 160) {
mWebView.getSettings().setDefaultZoom(ZoomDensity. MEDIUM);
} else{
mWebView.getSettings().setDefaultZoom(ZoomDensity. CLOSE);
}
String strUrl = "http://10.0.2.2:8080/WebTest3";
mWebView.loadUrl(strUrl);
}
// 处理返回的事件,(后退进入前一个界面而不是全部退出)
@Override
publicboolean onKeyDown( int keyCode, KeyEvent event) {
if(keyCode == KeyEvent. KEYCODE_BACK&& mWebView.canGoBack()) {
mWebView.goBack(); // 返回前一个页面
return true;
}
returnsuper.onKeyDown(keyCode, event);
}