工作中用到了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
5
、如果访问的页面中有
Javascript
,则
webview
必须设置支持
Javascript
,否则显示空白页面。
Java
代码
webview
.getSettings().setJavaScriptEnabled(
true
); 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
事件:
Java
代码
1.
public boolean onKeyDown(
int keyCode, KeyEvent event) {
2.
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
3. mWebView.goBack();
4.
nbsp;
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)为了让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 WebviewTestextendsActivity { /** 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 WebviewTestextendsActivity { /** 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-permissionandroid: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 TestWebviewDemoextends Activity { /** Calledwhen the activity is first created. */ privatestaticfinalString TAG ="TestWebviewDemo"; privateWebView mWebView; privateHandler mHandler = new Handler(); privateintmDensity; 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 voidclickOnAndroid(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-permissionandroid: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/> <inputtype="button"value="警告,提醒对话框"onclick="s()"> <br/><br/> <inputtype="button"value="带选择的对话框"onclick="d()"> <br/><br/> <inputtype="button"value="要求用户输入的对话框"onclick="f()"> </body> Manifest.Xml中: 加入权限: <uses-permissionandroid:name="android.permission.INTERNET"/> Java中的代码: public class TestextendsActivity { /** 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) { // TODOAuto-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); &nbnbsp; } } 需要注意的地方,很多数据类型js中不认识,最好是在android那边封装好,提供必要的方法接口。比如传到js中的list,在js中是没办法去得到里面的元素的。 Manifest.Xml中: 加入权限: <uses-permissionandroid: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-permissionandroid: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"> <optionvalue="2006">2006</option> <optionvalue="2007">2007</option> <optionvalue="2008">2008</option> <optionvalue="2009">2009</option> <optionvalue="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"/>男 <inputid="women"type="radio"name="sex" value="women"/>女 <br> <inputtype="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"> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activity android:name=".TestWebviewDemo"android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN" /> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <dataandroid:mimeType="vnd.android.cursor.dir/vnd.ruixin.login"/> </intent-filter> <intent-filter> <dataandroid: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-permissionandroid:name="android.permission.INTERNET" /> <uses-permissionandroid: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 TestWebviewDemoextends Activity { /** Calledwhen the activity is first created. */ privatestaticfinalString TAG ="TestWebviewDemo"; privateWebView mWebView; privateHandler mHandler = new Handler(); privateintmDensity; 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 nbsp; .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 voidclickOnAndroid(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); } |