[mw_shl_code=java,true]WebView是一个可以显示网页的控件。
需求:
通过WebView加载assets下的html文件。
实现页面的缩放。
向menu键添加:前进、后退和刷新,实现对网页的操作
点击网页中的链接,仍然使用本WebView浏览器,而非调用系统的浏览器
网页中有button,点击button,调用android的Toast
点击WebView隐藏地址栏和button,点击menu键显示地址栏和button。
WebView加载网页的方式
WebView webview = (WebView)findViewById(R.id.webview);
webview.loadUrl(" http://192.168.1.33:8080/  ");----访问本地服务器(如tomcat)的网页。
webview.loadUrl("http://www.baidu.com");------访问网络的的网页
webview.loadUrl(" file:///android_asset/test.html  ");---------访问本工程下assets下的html文件。。。。注意: file:///android_asset/是固定写法。
添加权限:“android.permission.INTERNET”
WebView的常用方法(介绍的是方法的作用,没有写参数,具体的方法使用在下面的示例中)
webview.setWebChromeClient();该方法可以处理进度条对话框等。
webview.setOnTouchListener();WebView设置触摸事件,比如我触摸屏幕时,可以隐藏地址栏等操作。
webview.setWebViewClient(WebViewClient client);设置该方法后,一旦你点击网页中的链接,不会去调用系统的浏览器,而是仍然使用当前的WebView浏览器。实现参数的匿名内部类
覆盖匿名内部类的方法 shouldOverrideUrlLoading(WebView view, String url),在该方法view.load(url);
onPageStarted():在网页加载前可以做的一些操作,比如加载网页需要一些时间,那么我们就让这段时间显示进度条或提示一句话"正在加载中"
onPageFinished():在网页加载后可以做的一些操作,比如关闭进度条。
WebSettings settings = webview.getSettings():就是WebView浏览器的一些设置。
设置网页的缩放:settings.setBuiltInZoomControls(true);也就是放大和缩小网页。
settings.setJavaScriptEnabled(true):可以让android和html中的javascript进行交互。
返回键:当我们打开多个Activity,一旦点击返回键,就直接退出WebView浏览器了。然而这不是我们想要的结果,我们想要的是一点击返回键,我们退回上一个页面。这时我哦们就需要重写onKeyDown()方法。
------7,8,9三条选看,是关于menu键的内容,网页的前进、后退和刷新-------
点击menu键:我们添加几个menu,实现网页的前进 后退和刷新功能。onCreateOptionsMenu();
为menu的item添加点击事件,实现前进,后退和刷新功能的具体实现方法。
点击一次menu,执行一次的方法:onPrepareOptionMenu()
android与javascript的交互:(在javascript中调用android代码)
背景:WebView加载了一个带button的html,我想点击该按钮调用android的吐司。
html代码:test.html的内容(html是非严谨的,因此如下直接复制就可以)
<button>call java</button>    
<script type="text/javascript">
        function demoTest(){
                window.demo.demoTest("hello android i am javaScript");        
        }
</script>
android内必须添加的代码:
//可以让android与javascript进行交互
        settings.setJavaScriptEnabled(true);
        //让javascript调用java代码时,需要添加如下android代码
        webview.addJavascriptInterface(new Object(){
            public void demoTest(String msg){
                showToast(msg);
            }
        }, "demo");
public void showToast(String str){//弹出吐司的方法
        Toast.makeText(MainActivity.this, str, 0).show();
    }
流程概述:
点击按钮:  执行:button的点击事件onclick="demoTest();"
点击事件demoTest();---->调用javascript代码的方法,执行window.demo.demoTest("hello android i am javaScript")
然后调用:android的"demo"接口的方法:public void demoTest(String msg){
                showToast(msg);
            }
showToast(msg),调用弹出吐司方法
这就是点击button调用android代码
关于android与javascript的直白理解:通过 settings.setJavaScriptEnabled(true);  方法设置android和javascript可以交互,在android中通过 webview.addJavascriptInterface(参数一:参数二) 方法 定义一个接口名称(参数二),通过该接口名称可以在javascript中调用该接口代表的对象的方法(参数一)。更啰嗦的说就是:参数一:new Object(){
            public void demoTest(String msg){
                showToast(msg);
            }定义了一个匿名内部类,该匿名内部类中定义了一个方法demoTest(String msg)。参数二:为该匿名内部类其的名字,通过该名字可以调用匿名内部类中定义的方法,并且必须是在javasrript中调用:调用方式:window.参数二.参数一方法名(参数)
在java中调用javascript代码:
首先需要在html中有script代码块,并且在script中定义了方法。
我们需要做的就在java中调用javascript中的方法
如何调用:WebView.loadUrl("javascript:方法名");

源码:test.html-------------该文件一定要放到assets下
       *****************************
test.html
<button>call java</button>
        <script type="text/javascript">
                function demoTest(){
                        window.demo.demoTest("hello android i am javaScript");        
                }
        </script>

布局文件:********************************************************8
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout
        android:id="@+id/ll_tool"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
        <!-- 地址栏 -->
        <EditText
            android:id="@+id/et"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="http://192.168.1.111" />
        <!-- 点击搜索 ,用WebView加载网页 -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="search"
            android:text="search" />
        <!-- java代码调用javascript的代码 -->
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="calljs"
            android:text="calljs" />
    </LinearLayout>
    <WebView
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1" />
</LinearLayout>

android代码:-----------------------********************************************
package com.example.a1302_webview;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends Activity {

private WebView webview;
        private EditText et;
        private ProgressDialog pd;
        private LinearLayout ll_tool;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                
                webview = (WebView) findViewById(R.id.webview);
                et = (EditText) findViewById(R.id.et);
                pd = new ProgressDialog(this);//进度条
                ll_tool = (LinearLayout) findViewById(R.id.ll_tool);
                
                //处理进度条、js对话框等时使用
                webview.setWebChromeClient(new WebChromeClient(){
                        @Override
                        public void onProgressChanged(WebView view, int newProgress) {
                                // TODO Auto-generated method stub
                                super.onProgressChanged(view, newProgress);
                                pd.setMessage("正在快速加载"+newProgress+"%");
                        }
                });
                
                //为WebView设置触摸事件,触摸屏幕时 因此地址栏和按钮
                webview.setOnTouchListener(new OnTouchListener() {
                        
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
                                // TODO Auto-generated method stub
                                if(ll_tool.isShown()){
                                        ll_tool.setVisibility(View.GONE);
                                }
                                return false;
                        }
                });
                
                //防止调用系统浏览器
                /*
                 * 用setWebViewClient方法设置webView客户端,用于接收webView发出的请求,通常的用法是覆盖其中的方法,
                 * 自己处理相关的事件,如:shouldOverrideUrlLoading(WebView view, String url);在自身webView中打开新的超链接。
                 */
                webview.setWebViewClient(new WebViewClient(){
                        //设置页面加载前的事件
                        @Override
                        public void onPageStarted(WebView view, String url, Bitmap favicon) {
                                // TODO Auto-generated method stub
                                super.onPageStarted(view, url, favicon);
                                pd.show();
                        }
                        
                        //设置页面加载后的事件
                        @Override
                        public void onPageFinished(WebView view, String url) {
                                // TODO Auto-generated method stub
                                super.onPageFinished(view, url);
//                                pd.cancel();
                                pd.dismiss();
                        }
                });
                //给 屏幕添加缩放
                /*
                 当webView对象构造生成时,便会生成一个默认的webset对象,里面包含了默认的设置,
                 可以用webSet = webView.getSettings();取得webset的引用,并对其进行修改。
                 */
                WebSettings settings = webview.getSettings();
                //该行代码写不写都可以,因为默认的是true,表示是否支持缩放
                settings.setSupportZoom(true);
                //缩放的设置
                settings.setBuiltInZoomControls(true);
                
                //即时缩放,设置初始比例
//                webview.setInitialScale(50);
//                //
//                webview.zoomIn();
//                webview.zoomOut();
                
                //可以让android与javascript进行交互
                settings.setJavaScriptEnabled(true);
                //让javascript调用java代码时,需要添加如下android代码
                webview.addJavascriptInterface(new Object(){
                        public void demoTest(String msg){
                                showToast(msg);
                        }
                }, "demo");
        }

public void showToast(String str){
                Toast.makeText(MainActivity.this, str, 0).show();
        }
        
        //在menu菜单增加几个选项
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                //参数三:order号码,可以通过getOrder标示该选项
                menu.addSubMenu(0,0,0,"刷新");//0刷新
                menu.addSubMenu(0,0,1,"前进");//1前进
                menu.addSubMenu(0,0,2,"后退");//2后退
                return true;
        }

//为menu裁断添加item选中事件
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                // TODO Auto-generated method stub
                switch (item.getOrder()) {//menu.addSubMenu(0,0,0,"刷新");获得的是第三个参数order
                case 0:
                        webview.reload();//刷新
                        break;
                case 1:
                        if(webview.canGoForward()){
                                webview.goForward();//前进
                        }
                        break;
                case 2:
                        if(webview.canGoBack()){
                                webview.goBack();//后退
                        }
                        break;

default:
                        break;
                }
                return super.onOptionsItemSelected(item);
        }
        
        //点击menu时显示地址栏和按钮,点击menu键一次执行一次该方法
        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {
                // 点击menu键显示地址栏和按钮
                ll_tool.setVisibility(View.VISIBLE);
                return super.onPrepareOptionsMenu(menu);
        }
        
        //点击事件,搜寻网址
        public void search(View v){
                /*
                 * loadUrl()方法webView加载页面,可以是url = "http://192.168.1.33:8080/" 
                 * 或 本地页面"file:///android_asset/index.html" webView1.loadUrl(url);
                 */
                String url = "file:///android_asset/test.html" ;
//                String url = et.getText().toString().trim();
                webview.loadUrl(url);
        }
        
        //点击返回键,不退出应用,而是回到上一个页面
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
                // TODO Auto-generated method stub
                if(keyCode==KeyEvent.KEYCODE_BACK&&webview.canGoBack()){
                        webview.goBack();
                        return true;
                }else{
                        return super.onKeyDown(keyCode, event);
                }
        }

//在java中调用javascript中的方法
    //调用方式:webview.loadUrl("javascript:方法名");
    public void calljs(View v){
        webview.loadUrl("javascript:demoTest()");
    }
}
[/mw_shl_code]

<ignore_js_op>

A1302_WebView.zip

WebView 加载网页和java 与js交互的更多相关文章

  1. WebView 加载网页 加载资源 总结 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Android中Http加载如何得到Cookie和 WebView 加载网页如何得到的Cookie

    最近做项目在手机端登录Http请求和 WebView 记载登录获取Cookie信息,可查看Cookie信息. 如图: Http请求获取Cookie信息: public static String re ...

  3. Flutter ------- WebView加载网页

    在Flutter 加载网页?也是有WebView的哦,和Android一样 1.添加依赖 dependencies: flutter_webview_plugin: ^0.2.1+2 2.导入库 im ...

  4. iOS之webview加载网页、文件、html的方法

    UIWebView  是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf.word.doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽  2.通过a ...

  5. webview加载网页加载不出来

    1.webView.loadUrl(picTargetUrl); 写在最前面. 1.在无线城市迷你版的项目,用webview去loadUrl的时候出现加载的现象. url 地址是 http://go. ...

  6. WebView加载网页文件

    转自:http://www.2cto.com/kf/201108/101518.html WebView(网络视图)能加载显示网页,可以将其视为一个浏览器.它使用了WebKit渲染引擎加载显示网页,实 ...

  7. WebView 加载网页返回后,jsp界面数据消失(一个斜杆引起来的风波)

    http://ip:port//interface/app/index.jsp 如果不小心就会把,port后面的//两个斜杆给忽略... 当有两个斜杆时,webview仍可以将网页,正常加载.但是数据 ...

  8. Android WebView 加载网页

    通过Android 中 WebView 控件加载HTML5 页面,这是实现Android 混合开发的基础. 选择加载的网页可以是本地,也可用使远程的.需要添加访问互联网的权限:<uses-per ...

  9. Android使用Webview加载网页

    安卓使用Webview来加载和显示网页内容,首先在layout文件中定义Webview <?xml version="1.0" encoding="utf-8&qu ...

随机推荐

  1. /etc/issue 与 /etc/issue.net 文件,telnet登陆前的显示

    在使用文本设备(关于文本设备的例子,见下面的说明)登录Linux系统之前,系统会显示一条被称作“issue”的消息: 若是通过本地文本设备(如本地终端,本地虚拟控制台等)登录,则该信息存放与/etc/ ...

  2. 浅谈Linux系统中如何查看进程 ——ps,pstree,top,w,全解

    进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源.一般来说,Linux系统会在进程之间共享程序代码和系统函数库,所以在任何时刻内存中都只有代码的一份拷贝. 1,ps命令 作用:p ...

  3. 响应式设计:根据不同设备引不同css样式

    <link rel="stylesheet" media="screen and (max-width:600px)" href="small. ...

  4. 以太坊go-ethereum客户端查询交易列表(二)

    玩过比特币的朋友都知道,比特币是可以通过api(listtransactions)查询指定地址的历史交易的.但在eth中没有提供类似的查询api.今天这篇博客就简单介绍一下如果解决这个问题. 问题 以 ...

  5. hdu 1848(SG函数)

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  6. 秀尔算法:破解RSA加密的“不灭神话” --zz

    http://netsecurity.51cto.com/art/201508/488766.htm RSA加密曾被视为最可靠的加密算法,直到秀尔算法出现,打破了RSA的不灭神话. RSA加密 VS ...

  7. jquery validate表单验证插件的基本使用方法及功能拓展

    1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家.    1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素 3.鼠标离开后的正确.错误提示及鼠标移入时的帮助提 ...

  8. WPS Office 2012 专业版 附正版序列号

    WPS Office 2012 专业版 附正版序列号 首先说说WPS的研发历史沿革:1988年5月,一个名叫求伯君的程序员凭借一台386电脑写出了WPS 1.0,从此开创了中文字处理时代,并迅速占领中 ...

  9. Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5492298.html 在面试中,经常会遇到一些考排序算法的题,在这里,我就简单了列举了几种最常见的排序算法供大家学习 ...

  10. 【转载】Xutils3-Dbutils

    Github源码地址:https://github.com/wyouflf/xUtils3 下面是源码中sample关于Dbutils的使用代码: import android.view.View; ...