【Android】视图绑定与网络编程webView

简介: 通过视图绑定viewBinding功能,您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。

【Android】视图绑定与网络编程webView



1. 视图绑定

视图绑定  | Android 开发者  | Android Developers (google.cn)

通过视图绑定viewBinding功能,您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。

1.1 打开 viewBinding

    //默认是关闭的,手动打开

   viewBinding{

       enabled=true

   }

网络异常,图片无法展示
|

1.2 viewBinding的使用

自动将xml文件生成java类  类的名字以xml的名字+Binding

也正是如此让我们不需要再使用findViewById()来获取控件,直接类名.组件ID就可以获取到控件的引用

//改造activity

activityMainBinding=ActivityMainBinding.inflate(getLayoutInflater());

setContentView(activityMainBinding.getRoot());

 

//优势一:无需findViewById,简化控件获取

//优势二:避免报空指针,控件管理更方便,有条理

activityMainBinding.txtViewId.setText("HNUCM");

网络异常,图片无法展示
|

2. WebView

在 WebView 中编译 Web 应用  | Android 开发者  | Android Developers (google.cn)

如果希望在客户端应用中提供 Web 应用(或只是网页),则可以使用 WebView 执行该操作。WebView 类是 Android 的 View 类的扩展,可将网页显示为 Activity 布局的一部分。它不会包含功能全面的网络浏览器的任何功能,例如导航控件或地址栏。WebView 默认只显示网页。

android里可以嵌套网页,如微信公众号,小程序

2.1 app嵌入网页

在xml文件中添加一个webView控件

网络异常,图片无法展示
|

要在 WebView 中加载网页,使用 loadUrl()方法:

activityMainBinding.webViewId.loadUrl("http://www.qq.com");

 

activityMainBinding.webViewId.loadUrl("http://www.qq.com");

 

activityMainBinding.webViewId.setWebViewClient(newWebViewClient(){

   @Override

   publicbooleanshouldOverrideUrlLoading(WebViewview, Stringurl) {

       view.loadUrl(url);

       returntrue;

   }

});

这样我们可以看到,成功将网页嵌入到了app中,不过网页仍然是以网页端显示

网络异常,图片无法展示
|

2.2 设置显示样式

通过如下设置可以使样式和手机端样式显示

网络异常,图片无法展示
|

WebSettingswebSettings=activityMainBinding.webViewId.getSettings();

//如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript

webSettings.setJavaScriptEnabled(true);

 

//设置自适应屏幕,两者合用

webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小

webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

//自适应屏幕

activityMainBinding.webViewId.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

 

//缩放操作

webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。

webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放

webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

 

//其他细节操作

webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存

webSettings.setAllowFileAccess(true); //设置可以访问文件

webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口

webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片

webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

 

//优先使用缓存

webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

//缓存模式如下:

//LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据

//LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。

//LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.

//LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据

//不使用缓存

webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

 

2.3 嵌入自定义(本地)网页

创建一个assets文件夹

Tips:Assets 目录是 Android 的一种特殊目录,用于放置 APP 所需的固定文件,且该文件被打包到 APK 中时,不会被编码到二进制文件

网络异常,图片无法展示
|

将自己写好的student.html(这是我web课的一个小作业)网页脚本,复制到assets文件夹下

需要修改一下文件的路径:

activityMainBinding.webViewId.loadUrl("file:///android_asset/student.html");

网络异常,图片无法展示
|

运行同样可以显示

网络异常,图片无法展示
|

可以看到在html(web)中的语法都能在android中生效,跳转同样的可以通过<a></a>标签实现

除此之外webView提供了跳转的方法

先在xml创建两个按钮来监听点击事件

网络异常,图片无法展示
|

webView提供goBack()goForward()方法监听网页间的跳转

activityMainBinding.button.setOnClickListener(newView.OnClickListener() {

    @Override

    publicvoidonClick(Viewview) {

        activityMainBinding.webViewId.goBack();

    }

});

 

activityMainBinding.button2.setOnClickListener(newView.OnClickListener() {

   @Override

   publicvoidonClick(Viewview) {

       activityMainBinding.webViewId.goForward();

   }

});

网络异常,图片无法展示
|

可以看到无论是用<a></a>标签还是,Android原生的按钮监听都能实现网页的跳转

网络异常,图片无法展示
|

3. 思索&下期预告

理想情况下,Android中的所有UI全部都可以通过webView使用网页来实现,但为什么web没有取代Android开发?那是不是前端的工程师都可以兼职开发Android,干嘛还要发展Android呢?

4.完整代码

MainActivity代码

publicclassMainActivityextendsAppCompatActivity {

 

   //viewBinding

   //自动将xml文件生成java类  类的名字以xml的名字+Binding

   ActivityMainBindingactivityMainBinding;

 

   @Override

   protectedvoidonCreate(BundlesavedInstanceState) {

       super.onCreate(savedInstanceState);

 

       //改造activity

       activityMainBinding=ActivityMainBinding.inflate(getLayoutInflater());

       setContentView(activityMainBinding.getRoot());

 

       //优势一:无需findViewById,简化控件获取

       //优势二:避免报空指针,控件管理更方便,有条理

       //activityMainBinding.txtViewId.setText("HNUCM");

 

 

       //问题一:并不是嵌入在app中

       activityMainBinding.webViewId.loadUrl("file:///android_asset/student.html");

 

       activityMainBinding.webViewId.setWebViewClient(newWebViewClient(){

           @Override

           publicbooleanshouldOverrideUrlLoading(WebViewview, Stringurl) {

               view.loadUrl(url);

               returntrue;

           }

       });

 

 

       WebSettingswebSettings=activityMainBinding.webViewId.getSettings();

       //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript

       webSettings.setJavaScriptEnabled(true);

 

       //设置自适应屏幕,两者合用

       webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小

       webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

       //自适应屏幕

       activityMainBinding.webViewId.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);

       webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

 

       //缩放操作

       webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。

       webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放

       webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

 

       //其他细节操作

       webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存

       webSettings.setAllowFileAccess(true); //设置可以访问文件

       webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口

       webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片

       webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式

 

       //优先使用缓存

       webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

       //缓存模式如下:

       //LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据

       //LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。

       //LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.

       //LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据

       //不使用缓存

       webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

 

       activityMainBinding.button.setOnClickListener(newView.OnClickListener() {

           @Override

           publicvoidonClick(Viewview) {

               activityMainBinding.webViewId.goBack();

           }

       });

 

       activityMainBinding.button2.setOnClickListener(newView.OnClickListener() {

           @Override

           publicvoidonClick(Viewview) {

               activityMainBinding.webViewId.goForward();

           }

       });

 

   }

}

activity_main.xml代码

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"

   xmlns:app="http://schemas.android.com/apk/res-auto"

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   tools:context=".MainActivity">



   <WebView

       android:id="@+id/webViewId"

       android:layout_width="match_parent"

       android:layout_height="500dp"

       app:layout_constraintStart_toStartOf="parent"

       app:layout_constraintTop_toTopOf="parent" />


   <Button

       android:id="@+id/button"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:layout_marginTop="60dp"

       android:text="返回"

       app:layout_constraintEnd_toStartOf="@+id/button2"

       app:layout_constraintHorizontal_bias="0.5"

       app:layout_constraintStart_toStartOf="parent"

       app:layout_constraintTop_toBottomOf="@+id/webViewId" />


   <Button

       android:id="@+id/button2"

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="前进"

       app:layout_constraintEnd_toEndOf="parent"

       app:layout_constraintHorizontal_bias="0.5"

       app:layout_constraintStart_toEndOf="@+id/button"

       app:layout_constraintTop_toTopOf="@+id/button" />


</androidx.constraintlayout.widget.ConstraintLayout>

student.html代码

<!DOCTYPE html>

<html lang="en">

<head>

   <meta charset="UTF-8">

   <meta http-equiv="X-UA-Compatible" content="IE=edge">

   <meta name="viewport" content="width=device-width, initial-scale=1.0">

   <title>Document</title>

   <style>

       th{

           border: 1px solid black;

           background-color: antiquewhite;

           padding: 5px;

       }

       td{

           border: 1px solid black;

           font-family: 'Courier New', Courier, monospace;

           padding: 4px;

       }

       table{

           border-collapse: collapse;

           width: 90%;

           margin: auto;

       }

       div{

           border: 1px solid black;

           width: 60%;

           margin: auto;

       }


   </style>


</head>

<body style="text-align:center">

   <script>

       function add(obj){

           

           var vstu_id=formNode.stu_id.value;

           var vstu_name=formNode.stu_name.value;

           var vstu_sex=formNode.stu_sex.value;

           if(vstu_id==""||vstu_name==""||vstu_sex==""){

               alert("数据不能为空!");

           }else{


           

               alert(vstu_id+' '+vstu_name+' '+vstu_sex)


               var vtable1=document.getElementById('table1');


               var vtr=document.createElement('tr');

               


               var vtd_id=document.createElement('td');

               vtd_id.innerText=vstu_id;


               var vtd_name=document.createElement('td');

               vtd_name.innerText=vstu_name;


               var vtd_sex=document.createElement('td');

               vtd_sex.innerHTML=vstu_sex;


               var vth_del=document.createElement('td');

               

               var va=document.createElement('a');

               va.setAttribute("href","JavaScript:void(0)");

               va.setAttribute("onclick","del(this)");

               va.innerHTML="删除";

               vth_del.appendChild(va);


               vtr.appendChild(vtd_id);

               vtr.appendChild(vtd_name);

               vtr.appendChild(vtd_sex);

               vtr.appendChild(vth_del);


               vtable1.appendChild(vtr);

           }


       }


       function del(obj){

           var msg="确定删除这条数据吗?";


           if(confirm(msg)==true){

               var vth_delNode=obj.parentNode;

               var vtrNode=vth_delNode.parentNode;

               var vtable1=vtrNode.parentNode;

               vtable1.removeChild(vtrNode);

           }

       }

   </script>

   

   <div>


       <a href ="file:///android_asset/student2.html">跳转</a>

       <form name="formNode" style="margin-top: 15px">

           编号:<input type="text" maxlength="3" size="4" name="stu_id">

           姓名:<input type="text" maxlength="8" size="4" name="stu_name">

           性别:<input type="text" size="4" name="stu_sex">

           <input type="button" value="添加" onclick="add(this)">

       </form>

       <table style="margin-top: 20px; margin-bottom: 20px;" id="table1">

           <caption style="font-size: 20px;">学生成绩表</caption>

           <tr>

               <th>编号</th>

               <th>姓名</th>

               <th>性别</th>

               <th>操作</th>

           </tr>

   

           <tr>

               <td>001</td>

               <td>lixu</td>

               <td>nan</td>

               <td><a onclick="del(this)" href="JavaScript:void(0)">删除</a></td>

           </tr>

       </table>

       

   </div>

</body>

</html>


相关文章
|
1月前
|
缓存 网络协议 安全
Android网络面试题之Http基础和Http1.0的特点
**HTTP基础:GET和POST关键差异在于参数传递方式(GET在URL,POST在请求体),安全性(POST更安全),数据大小限制(POST无限制,GET有限制),速度(GET较快)及用途(GET用于获取,POST用于提交)。面试中常强调POST的安全性、数据量、数据类型支持及速度。HTTP 1.0引入了POST和HEAD方法,支持多种数据格式和缓存,但每个请求需新建TCP连接。**
30 5
|
1月前
|
安全 网络协议 算法
Android网络基础面试题之HTTPS的工作流程和原理
HTTPS简述 HTTPS基于TCP 443端口,通过CA证书确保服务器身份,使用DH算法协商对称密钥进行加密通信。流程包括TCP握手、证书验证(公钥解密,哈希对比)和数据加密传输(随机数加密,预主密钥,对称加密)。特点是安全但慢,易受特定攻击,且依赖可信的CA。每次请求可能复用Session ID以减少握手。
28 2
|
1月前
|
缓存 JSON 网络协议
Android面试题:App性能优化之电量优化和网络优化
这篇文章讨论了Android应用的电量和网络优化。电量优化涉及Doze和Standby模式,其中应用可能需要通过用户白名单或电池广播来适应限制。Battery Historian和Android Studio的Energy Profile是电量分析工具。建议减少不必要的操作,延迟非关键任务,合并网络请求。网络优化包括HTTPDNS减少DNS解析延迟,Keep-Alive复用连接,HTTP/2实现多路复用,以及使用protobuf和gzip压缩数据。其他策略如使用WebP图像格式,按网络质量提供不同分辨率的图片,以及启用HTTP缓存也是有效手段。
46 9
|
1月前
|
缓存 网络协议 Android开发
Android网络面试题之Http1.1和Http2.0
HTTP/1.1 引入持久连接和管道机制提升效率,支持分块传输编码和更多请求方式如PUT、PATCH。Host字段指定服务器域名,RANGE用于断点续传。HTTP/2变为二进制协议,实现多工处理,头信息压缩和服务器推送,减少延迟并优化资源加载。HTTP不断发展,从早期的简单传输到后来的高效交互。
26 0
Android网络面试题之Http1.1和Http2.0
|
1月前
|
JSON Java API
【Android】使用 Retrofit2 发送异步网络请求的简单案例
**摘要:** Retrofit是Android和Java的HTTP客户端库,简化了RESTful API交互。它通过Java接口定义HTTP请求,并提供注解管理参数、HTTP方法等。要使用Retrofit,首先在AndroidManifest.xml中添加`INTERNET`权限,然后在`build.gradle`中引入Retrofit和Gson依赖。创建服务器响应数据类和描述接口的接口,如`Result`和`Api`。通过Retrofit.Builder配置基础URL并构建实例,之后调用接口方法创建Call对象并发送异步请求。
61 1
|
1月前
|
缓存 网络协议 Java
Android面试题之Java网络通信基础知识
Socket是应用与TCP/IP通信的接口,封装了底层细节。网络通信涉及连接、读写数据。BIO是同步阻塞,NIO支持多路复用(如Selector),AIO在某些平台提供异步非阻塞服务。BIO示例中,服务端用固定线程池处理客户端请求,客户端发起连接并读写数据。NIO的关键是Selector监控多个通道的事件,减少线程消耗。书中推荐《Java网络编程》和《UNIX网络编程》。关注公众号AntDream了解更多。
26 2
|
1月前
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
1月前
|
XML JSON Java
Android面试题 之 网络通信基础面试题
序列化对比:Serializable码流大、性能低;XML人机可读但复杂;JSON轻量、兼容性好但空间消耗大;ProtoBuff高效紧凑。支持大量长连接涉及系统限制调整、缓冲区优化。select/poll/epoll是IO多路复用,epoll在高连接数下性能更优且支持边缘触发。水平触发持续通知数据,边缘触发仅通知新数据。直接内存减少一次拷贝,零拷贝技术如sendfile和MMAP提升效率。关注公众号&quot;AntDream&quot;了解更多技术细节。
20 1
|
1月前
|
Android开发 Kotlin
Android面试题 之 Kotlin DataBinding 图片加载和绑定RecyclerView
本文介绍了如何在Android中使用DataBinding和BindingAdapter。示例展示了如何创建`MyBindingAdapter`,包含一个`setImage`方法来设置ImageView的图片。布局文件使用`&lt;data&gt;`标签定义变量,并通过`app:image`调用BindingAdapter。在Activity中设置变量值传递给Adapter处理。此外,还展示了如何在RecyclerView的Adapter中使用DataBinding,如`MyAdapter`,在子布局`item.xml`中绑定User对象到视图。关注公众号AntDream阅读更多内容。
26 1
|
24天前
|
Web App开发 JavaScript 前端开发
Android端使用WebView注入一段js代码实现js调用android
Android端使用WebView注入一段js代码实现js调用android
32 0