前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android应用界面开发——WebView

Android应用界面开发——WebView

作者头像
trampcr
发布于 2018-09-28 07:43:01
发布于 2018-09-28 07:43:01
85400
代码可运行
举报
文章被收录于专栏:7号代码7号代码
运行总次数:0
代码可运行

WebView组件本身就是一个浏览器实现,Android5.0增强的WebView基于Chromium M37,直接支持WebRTC、WebAudio、WebGL。开发者可以直接在WebView中使用聚合(Polymer)和Material设计。

一.WebView浏览网页(加载线上URL)


WebView提供了很多方法执行浏览器操作,常用方法如下:

  • void goBack():后退
  • void goForward():前进。
  • void goBackOrForward(int step):step为正表示前进,step为负表示后退。
  • void loadUrl(String url):加载指定URL对应的网页。
  • boolean zoomIn():放大网页。
  • boolean zoomOut():缩小网页。

实例:迷你浏览器

该实例包含两个界面,第一个界面包括输入网址和打开网址,第二个界面包含一个WebView,用于显示第一个界面输入的URL对应的界面。程序代码如下:

第一个界面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {

    private EditText mEditUrl;
    private Button mBtnOpen;

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

        mEditUrl = (EditText) findViewById(R.id.edit_url);
        mBtnOpen = (Button) findViewById(R.id.btn_open);

        mBtnOpen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, WebViewActivity.class);
                String url = mEditUrl.getText().toString();
                intent.putExtra("url", url);
                startActivity(intent);
            }
        });
    }
}

这个界面很简单,一个输入框,一个按钮,分别用于输入网址和打开WebView。

第二个界面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class WebViewActivity extends AppCompatActivity {

    private WebView mWebView;

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

        mWebView = (WebView) findViewById(R.id.web_view);

        Intent intent = getIntent();
        String url = intent.getStringExtra("url");
        mWebView.loadUrl(url);
        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new WebViewClient(){

        });
    }
    @Override
    public void onBackPressed() {
        if (mWebView != null && mWebView.canGoBack()){
            mWebView.goBack();
        }else {
            super.onBackPressed();
        }
    }
}

这段代码调用WebView的loadUrl(String url)方法加载、显示该URL对应的网页,并设置使其支持JavaScript。如果打开WebView过程中跳转到浏览器,则通过设置WebViewClient来是其在WebView中显示。

并重写了onBackPressed()方法,当WebView不为空且WebView可以回退时,返回上一个WebView界面,而不是直接回退到上一个Activity。

由于该应用需要访问互联网,所以需要在AndroidManifest.xml中配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<uses-permission android:name="android.permission.INTERNET"/>

该实例的效果图如下:

二.WebView加载HTML代码


WebView提供了一个loadData(String data, String mimeType, String encoding)方法,该方法可用于加载并显示HTML代码,但该方法会发生乱码。

WebView还提供了一个loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)方法,该方法是loadData(String data, String mimeType, String encoding)方法的增强版,不会产生乱码。该方法的几个参数说明:

  • data:指定要加载的HTML代码。
  • mimeType:指定HTML的MIME类型,对于HTML可指定为text/html。
  • encoding:指定HTML代码编码所用的字符集,比如指定为GBK。

WebView加载HTML代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {

    private WebView mShowWebView;

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

        mShowWebView = (WebView) findViewById(R.id.show_web_view);
        StringBuilder sb = new StringBuilder();
        //拼接一段HTML代码
        sb.append("<html>");
        sb.append("<head>");
        sb.append("<title> 欢迎您 </title>");
        sb.append("</head>");
        sb.append("<body>");
        sb.append("<h2> 欢迎您访问<a href = \"http:www.baicu.com\">" + "百度一下</a></h2>");
        sb.append("</body>");
        sb.append("</html");
        //加载并显示HTML代码
        mShowWebView.loadDataWithBaseURL(null, sb.toString(), "text/html", "utf-8", null);
    }
}

该实例运行效果如下:

三.WebView中的JavaScript调用Android方法


在WebView中调用Android方法需要三步:

  • 调用WebView关联的WebSettings的setJavaScriptEnabled(true)启用JavaScript调用功能。
  • 调用WebView的addJavaScriptInterface(Object object, String name)方法将object对象暴露给JavaScript对象。
  • 在JavaScript脚本中通过刚才暴露的name对象调用Android方法。

写一个在JavaScript中调用Android方法的实例,该实例界面包含一个WebView组件,用于显示HTML页面。Activity代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {

    private WebView mWebView;

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

        mWebView = (WebView) findViewById(R.id.web_view);

        //使用file协议加载本地assets目录下的HTML页面
        mWebView.loadUrl("file:///android_asset/test.html");
        //获取WebView的设置对象
        WebSettings webSettings = mWebView.getSettings();
        //开启JavaScript调用
        webSettings.setJavaScriptEnabled(true);
        //将MyObject对象暴露给JavaScript对象
        mWebView.addJavascriptInterface(new MyObject(this), "myObj");
    }
}

在上面代码中开启了JavaScript调用Android方法的功能,并将Android应用中的MyObject对象暴露给JavaScript脚本,暴露成JavaScript脚本中名为myObj的对象。

MyObject代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyObject {

    private Context context;

    public MyObject(Context context) {
        this.context = context;
    }

    //该方法将会暴露给JavaScript脚本调用
    @JavascriptInterface
    public void showToast(String name) {
        Toast.makeText(context, name + ",您好!", Toast.LENGTH_SHORT).show();
    }

    //该方法将会暴露给JavaScript脚本调用
    @JavascriptInterface
    public void showList() {
        //显示一个普通的列表对话框
        new AlertDialog.Builder(context)
                .setTitle("图书列表")
                .setIcon(R.mipmap.ic_launcher)
                .setItems(new String[]{"Head First Android", "Head First Java", "Thinking in Java"}, null)
                .setPositiveButton("确定", null)
                .create()
                .show();
    }
}

MyObject中包含了两个方法,showToast()和showList()方法,且这两个方法使用了@JavascriptInterface修饰,使得这两个方法会暴露给JavaScript脚本,从而允许JavaScript脚本通过myObj来调用这两个方法。HTML页面代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <title> Js调用Android</title>
</head>
<body>
<!-- 注意此处的myObj是Android暴露出来的对象-->
<input type="button" value="打招呼"
        onclick="myObj.showToast('Android');"/>
<input type="button" value="图书列表"
       onclick="myObj.showList();"/>
</body>
</html>

当用户点击页面上的两个按钮时,该页面的JavaScript脚本会通过myObj调用Android方法。

运行该实例,点击第一个按钮,效果图如下:

点击第二个按钮,效果图如下:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.08.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android中使用WebView与JS交互全解析
首先,需要提出一个概念,那就是hybrid,主要意思就是native原生Android和h5混合开发。为什么要这样做呢?大家可以想象一下针对于同一个活动,如果使用纯native的开发方式,Android和iOS两边都要维护同一套界面甚至是逻辑,这样开发和维护的成本会很大,而使用hybrid的开发方式的话,让前端的同学去写一套界面和逻辑,对于native端来说只要使用对应的容器去展示就可以了(对于Android来说这个容器当然就是WebView)。那为什么不所有的页面都使用这种方式开发呢?因为使用h5来展示界面的话用户体验始终是不如native的,所以在这两者之间我们需要一个权衡。
老马的编程之旅
2022/06/22
1.7K0
Android中使用WebView与JS交互全解析
史上最全webview详解
WebView在现在的项目中使用的频率应该还是非常高的。 我个人总觉得HTML5是一种趋势。找了一些东西,在此总结。 本篇最后有一个非常不错 的 Html5Activity 加载类,不想看的可以直接跳下载。 WebSettings WebSettings webSettings = mWebView .getSettings(); //支持获取手势焦点,输入用户名、密码或其他 webview.requestFocusFromTouch(); setJavaScriptEnabled(true);
xiangzhihong
2018/02/01
6.7K0
WebView完全解读
WebView是一个使用WebKit引擎(4.4之后基于Chromium)的浏览器控件。因此可以将WebView当做一个完整的浏览器使用。
小小工匠
2021/08/16
3.5K0
一个标准的WebView示例
xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/a
六月的雨
2018/05/14
7290
WebView深度学习(一)之WebView的基本使用以及Android和js的交互
//设置WebView缓存(当加载 html 页面时,WebView会在/data/data/包名目录下生成 database 与 cache 两个文件夹,请求的 URL记录保存在 WebViewCache.db,而 URL的内容是保存在 WebViewCache 文件夹下)
AWeiLoveAndroid
2018/09/03
6.4K0
WebView深度学习(一)之WebView的基本使用以及Android和js的交互
Android实现WebView加载assets文件夹下的html文件,html返回webView.canGo,android嵌入h5进行交互,调试错误 net::ERR_FILE_NOT_FOUND
我的环境:win7 ,Android studio 3.0.1.   java8;
zhangjiqun
2024/12/16
1210
Android WebView 与Js交互,混合开发基础
WebChromeClient:当影响【浏览器】的事件到来时,就会通过WebChromeClient中的方法回调通知用法。
对话、
2022/02/22
3.2K0
Android WebView 与Js交互,混合开发基础
Android:最全面的 Webview 详解
注意: 每个 Application 只调用一次 WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize()
Carson.Ho
2019/02/22
3.7K0
Android应用之Hybird混合开发,集成web页面的方法尝试
1.在Android项目代码目录的app/src/main目录下面创建个assets文件夹。
杨永贞
2020/08/04
7460
webview和js交互
今天主要总结两点:一是使用Js去调用客户端公有方法,二是从客户端调用Js中的方法 一、JS调用客户端公有方法 上例子:(PS:不会写JS,就网上找了一段js代码) 新建项目,在项目的assets文件夹下创建一个test.html: <body> <a>Web与Js交互:点击我,来调用客户端的show方法吧</a> <script> function funFromjs(){ document.getElementById("helloweb").innerHTML="我是JS里
xiangzhihong
2018/01/30
4.3K0
webview和js交互
WebView的使用及实战
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/53084703
程序员徐公
2018/09/18
9290
WebView的使用及实战
Android:你要的WebView与 JS 交互方式 都在这里了
对于Android调用JS代码的方法有2种: 1. 通过WebView的loadUrl() 2. 通过WebView的evaluateJavascript()
Carson.Ho
2019/02/22
7K0
在开发中实现点击 WebView 中的图片,调用原生控件放大展示
现在有很多时候,我们的 App 都进行了混合开发,而最简单,最常用的就是有些网页采用了 WebView 进行展示,这就需要我们了解和懂得如何实现 WebView 和 JS 进行交互。今天我们就来学习一下,如何点击 WebView 中的网页图片,调用原生控件进行放大展示。 其实实现这种交互非常简单,就是通过 JS 调用原生控件。基本思路如下: 首先加载一个 html 网页,网址或者本地 html 文件都可以。 遍历 html 标签源代码,找到所有的 img 标签节点。 给 遍历到得 img 标签节点加上 on
非著名程序员
2018/02/09
2.4K0
在开发中实现点击 WebView 中的图片,调用原生控件放大展示
JS与Native交互
然后,WebView 读取你存放的SD卡资源或者assets资源(选其中一个就行)
White feathe
2021/12/08
3.8K0
JS与Native交互
Android开发笔记(六十四)网页加载与JS调用
如果一个网站已经有现成的网页及业务逻辑,那么使用WebView将其内嵌到app中,省去了app重画页面与http通信的事情,无疑是更经济的做法。WebView就是Android上的一个浏览器内核,可自动展示web页面,并且实现js代码的相互调用。 下面是WebView的常用方法: getSettings : 获取浏览器的web设置信息。 addJavascriptInterface : 添加本地的js代码接口。 removeJavascriptInterface : 移除本地的js代码接口。在4.0至4.2的Android系统上,Webview自己增加了searchBoxJavaBredge_,可能被黑客利用导致远程代码执行。为阻止该漏洞,需要手工移除接口searchBoxJavaBredge_。代码如下所示:
aqi00
2019/01/18
6.4K0
[android] WebView与Js交互
调用WebView对象的getSettings()方法,获取WebSettings对象
唯一Chat
2019/09/10
5.8K0
[android] WebView与Js交互
Android在WebView中加载HTML并实现交互
Android在WebView中加载HTML并实现交互 正在开发一个地图程序, 相对于用XML写安卓界面, 我更愿意用这个方法, 就是不用Android自带的MapView, 而是使用之前就已经比较熟悉的Google Maps JavaScript API, 在Android的WebView中载入HTML代码, 利用Android提供的强大的Java与Js的交互功能, 用网页作为界面来开发程序,同时也可以用Js回调机器的本地功能比如GPS等. 下面提供一个演示的例子,代码如下: package com.a
用户1289394
2018/02/26
9680
android中webview控件和javascript交互实例
当我们要实现丰富的图文混排效果的时候,我们一般会使用webview,这是一个功能十分强大的的控件,来看看官方的解释:
战神伽罗
2019/07/24
1.5K0
相关推荐
Android中使用WebView与JS交互全解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验