首先要在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代码
- mWebView.setWebViewClient(new WebViewClient(){
- public boolean shouldOverrideUrlLoading(WebView view, String url) {
- view.loadUrl(url);
- return true;
- }
- });
上述方法告诉系统由我这个WebViewClient处理这个Intent,我来加载URL。点击一个链接的Intent是向上冒泡的,shouldOverrideUrlLoading方法return true表示我加载后这个Intent就消费了,不再向上冒泡了。
7、如果不做任何处理,在显示你的Brower UI时,点击系统“Back”键,整个Browser会作为一个整体“Back"到其他Activity中,而不是希望的在Browser的历史页面中 Back。如果希望实现在历史页面中Back,需要在当前Activity中处理并消费掉该Back事件:
Java代码
- public boolean onKeyDown(int keyCode, KeyEvent event) {
- if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
- mWebView.goBack();
- return true;
- }
- return super.onKeyDown(keyCode, event);
- }
对于Android 2.0开始又多出了一种新的方法,对于Activity 可以单独获取Back键的按下事件,直接重写 onBackPressed 方法即可,代码如下
Java代码
- @Override
- public void onBackPressed() {
- // 这里处理逻辑代码,该方法仅适用于2.0或更高版本的sdk
- return ;
- }
这里还有几个知识点:
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() {
- public voidonClick(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() {
- public voidonClick(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. */
- privatestatic finalString 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);
- return super.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
- public voidonClick(DialogInterface dialog,
- int which) {
- // TODO Auto-generated method stub
- result.confirm();
- }
- });
- builder.setCancelable(false);
- builder.create();
- builder.show();
- return true;
- }
- // 带按钮的对话框
- 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
- public voidonClick(DialogInterface dialog,
- int which) {
- // TODO Auto-generated method stub
- result.confirm();
- }
- });
- builder.setNeutralButton(android.R.string.cancel,
- new AlertDialog.OnClickListener() {
- @Override
- public voidonClick(DialogInterface dialog,
- int which) {
- // TODO Auto-generated method stub
- result.cancel();
- }
- });
- builder.setCancelable(false);
- builder.create();
- builder.show();
- return true;
- }
- // 带输入框的对话框
- 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
- public voidonClick(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
- public voidonClick(DialogInterface dialog,
- int which) {
- // TODO Auto-generated method stub
- result.cancel();
- }
- });
- builder
- .setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public voidonCancel(DialogInterface dialog) {
- // TODO Auto-generated method stub
- result.cancel();
- }
- });
- builder.create();
- builder.show();
- return true;
- }
- // 设置网页加载的进度条
- 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
- public voidrun() {
- // 逻辑代码
- });
- }
- }, "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 onClick="window.demo.clickOnAndroid()"><divstyledivstyle="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/>
- <inputtypeinputtype="button" value="警告,提醒对话框" onclick="s()">
- <br/><br/>
- <inputtypeinputtype="button" value="带选择的对话框" onclick="d()">
- <br/><br/>
- <inputtypeinputtype="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) {
- // 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);
- }
- }
需要注意的地方,很多数据类型js中不认识,最好是在android那边封装好,提供必要的方法接口。比如传到js中的list,在js中是没办法去得到里面的元素的。
Manifest.Xml中:
加入权限:
<uses-permission android:name="android.permission.INTERNET" />
html的带码
- <script language="javascript">
- window.onload= 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:androidLinearLayoutxmlns: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>
- <scriptlanguagescriptlanguage="javascript"><!--
- function fillContent(){
- document.getElementById("content").innerHTML =
- "This Content is showedby Android invoke Javascript function.";
- }
- // --></script>
- <body>
- <p><a onClick="window.demo.startMap()"href="">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">
- <optionvalueoptionvalue="2006">2006</option>
- <optionvalueoptionvalue="2007">2007</option>
- <optionvalueoptionvalue="2008">2008</option>
- <optionvalueoptionvalue="2009">2009</option>
- <optionvalueoptionvalue="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"/>男
- <inputidinputid="women" type="radio" name="sex" value="women"/>女
- <br>
- <inputtypeinputtype="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:iconapplicationandroid:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".TestWebviewDemo" android:label="@string/app_name">
- <intent-filter>
- <actionandroid:nameactionandroid:name="android.intent.action.MAIN" />
- <categoryandroid:namecategoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- <intent-filter>
- <dataandroid:mimeTypedataandroid:mimeType="vnd.android.cursor.dir/vnd.ruixin.login"/>
- </intent-filter>
- <intent-filter>
- <dataandroid:mimeTypedataandroid: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:nameuses-permissionandroid:name="android.permission.INTERNET" />
- <uses-permissionandroid:nameuses-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 TestWebviewDemo extends Activity {
- /** Calledwhen the activity is first created. */
- privatestatic finalString 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);
- return super.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
- public voidonClick(DialogInterface dialog,
- int which) {
- // TODO Auto-generated method stub
- result.confirm();
- }
- });
- builder.setCancelable(false);
- builder.create();
- builder.show();
- return true;
- }
- // 带按钮的对话框
- 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
- public voidonClick(DialogInterface dialog,
- int which) {
- // TODO Auto-generated method stub
- result.confirm();
- }
- });
- builder.setNeutralButton(android.R.string.cancel,
- new AlertDialog.OnClickListener() {
- @Override
- public voidonClick(DialogInterface dialog,
- int which) {
- // TODO Auto-generated method stub
- result.cancel();
- }
- });
- builder.setCancelable(false);
- builder.create();
- builder.show();
- return true;
- }
- // 带输入框的对话框
- 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
- public voidonClick(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
- public voidonClick(DialogInterface dialog,
- int which) {
- // TODO Auto-generated method stub
- result.cancel();
- }
- });
- builder
- .setOnCancelListener(new DialogInterface.OnCancelListener() {
- @Override
- public voidonCancel(DialogInterface dialog) {
- // TODO Auto-generated method stub
- result.cancel();
- }
- });
- builder.create();
- builder.show();
- return true;
- }
- // 设置网页加载的进度条
- 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
- public voidrun() {
- 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;
- }