Android的WebView简单使用实例(附Demo)
Demo地址:https://github.com/zGuangYuan/Androidstudio_example
WebView介绍:
Android WebView在Android平台上是一个特殊的View, 基于webkit引擎、展现web页面的控件,这个类可以被用来在你的app中仅仅显示一张在线的网页,还可以用来开发浏览器。WebView内部实现是采用渲染引擎来展示view的内容,提供网页前进后退,网页放大,缩小,搜索。
功能:
加载网页:
1.加载URL(网络或者本地assets文件夹下的html文件)
2.加载html代码
3.Native和JavaScript相互调用
如何加载网络的URL:
使用方法:webview.loadUrl(“网址”),就可以访问网页了
如何加载assets下的html文件
使用方法:webview.loadUrl("本地文件名")
如何加载html代码
方法一:webview.loadData();
方法二:webview.loadDataWithBaseURL();
网页的前进后退
使用方法:webview.canGoBack(),判断是否能返回。
使用方法:webview.goBack();返回
使用方法:webview.canGoForward();判断是否能前进
使用方法:webview.goForward();前进
使用方法:webview.canGoBackOrForWard(int steps);判断是否能前进或者后退,参数是int类型,+3是否可以前进三步,-3代表是否可以后退三步。
注意:我们在Android操作系统中,按返回键,默认退出当前的Activity,如果希望是WebView在一个Activity的页面后退怎么做呢?
需要去复写onKeyDown方法改变按返回键的状态,如果按返回键时,网页还可以返回,那么就执行网页返回,webview.canGoBack();方法判断,如果网页没得返回了就退出当前的Activity.
新建一个包,命名为WebView:
在WebView中新建一个Empty Activity,命名为WebViewActivity :
在默认的MainActivity新增一个按钮能跳转到WebViewActivity :
在MainActivity中为这个按钮绑定一个监听器,实现选择跳转:
整体代码:
package com.example.yuan.e06_gridview;import android.content.Intent;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.example.yuan.e06_gridview.GridView.GridViewActivity;import com.example.yuan.e06_gridview.ListView.ListViewActivity;import com.example.yuan.e05_listview.R;import com.example.yuan.e06_gridview.RecycleView.RecycleViewActivity;import com.example.yuan.e06_gridview.WebView.WebViewActivity;public class MainActivity extends AppCompatActivity { //声明引用 private Button mIVButton; private Button mLVButton; private Button mGVButton; private Button mRVButton; private Button mWVButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取控件对象 mIVButton=(Button) findViewById(R.id.IVButton_Id); mLVButton=(Button) findViewById(R.id.LVButton_Id); mGVButton=(Button) findViewById(R.id.GVButton_Id); mRVButton=(Button) findViewById(R.id.RVButton_Id); mWVButton=(Button) findViewById(R.id.WVButton_Id); setlistener(); } //设置监听器 public void setlistener(){ ButtonClickListener listener =new ButtonClickListener(); mLVButton.setOnClickListener(listener); mIVButton.setOnClickListener(listener); mGVButton.setOnClickListener(listener); mRVButton.setOnClickListener(listener); mWVButton.setOnClickListener(listener); } //实现监听器接口 class ButtonClickListener implements OnClickListener{ @Override public void onClick(View v) { Intent intent = null; switch (v.getId()){ case R.id.GVButton_Id: intent=new Intent(MainActivity.this, GridViewActivity.class); break; case R.id.IVButton_Id: intent = new Intent(MainActivity.this,ImageViewActivity.class); break; case R.id.LVButton_Id: intent =new Intent(MainActivity.this, ListViewActivity.class); break; case R.id.RVButton_Id: intent = new Intent(MainActivity.this, RecycleViewActivity.class); break; case R.id.WVButton_Id: intent =new Intent(MainActivity.this, WebViewActivity.class); break; } startActivity(intent); } }}
基本工作完成,进入主题。
1. 加载assets下的html文件
新建一个Assets文件夹:
需要在assets放置一个html文件,本地新建一个hello.html,文件,如下:
复制到assets文件夹下:
在WebViewActivity对应的布局文件,activity_web_view.xml,新建一个WebView控件。
在WebViewActivity声明控件,获取控件对象,然后加载hello.html这个文件:
运行应用程序,成功加载本地的html文件:
这是最简单的本地html的加载,同样你也可以把网页的Html给复制出来,然后到本地加载,我们试一试:
找到一篇博客,然后复制他的html内容,博客地址:https://blog.csdn.net/qq_36243942/article/details/82187204
右边一个弹窗:点击图片的地方:
然后在上边的文字右键,这样就复制了这篇文章的Html代码了:
赋值到本地assets文件夹中,很复杂的一堆东西:
接下来运行这个应用程序,就可以加载网页的内容啦,可以上下滑动查看全部内容:
我们也可以直接加载网络的URL,试一下
2.加载网络的URL:
修改WebViewActivity,直接去访问博客的地址:
运行一下,可以成功加载出来了:
把URL地址改成百度的访问一下:网址:https://m.baidu.com
运行应用程序,发现显示不出来:怎么回事?
这是因为如果WebView加载页面里面需要JavaScrip的支持,那么你需要对WebView进行设置,默认不支持JavaScrip,百度首页是需要JS支持的,所以访问之前也需要先对WebView进行设置,增加一个方法,getSettings().setJavaScriptEnabled(true);方法设置为真,表示支持JavaScrip.增加这个方法后再次访问试一下:
发现,现在就可以正常访问百度首页了:
试一下能不能使用搜索引擎,发现有一些是可以的,但是一些不行:
这是为什么呢?有一些网页,你打开的时候,不是默认在这个WebView基础之上继续打开的,如何设置?
修改WebViewActivity.java。继续在当前WebView继续加载网页:
代码:
package com.example.yuan.e06_gridview.WebView;import android.graphics.Bitmap;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.webkit.WebResourceRequest;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Button;import com.example.yuan.e05_listview.R;public class WebViewActivity extends AppCompatActivity { //声明引用 private WebView mWVmhtml; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); //获取控件对象 mWVmhtml=(WebView) findViewById(R.id.WV_Id); //加载本地html文件 // mWVmhtml.loadUrl("file:///android_asset/hello.html"); //加载网络URL //mWVmhtml.loadUrl("https://blog.csdn.net/qq_36243942/article/details/82187204"); //设置JavaScrip mWVmhtml.getSettings().setJavaScriptEnabled(true); //访问百度首页 mWVmhtml.loadUrl("https://m.baidu.com"); //设置在当前WebView继续加载网页 mWVmhtml.setWebViewClient(new MyWebViewClient()); } class MyWebViewClient extends WebViewClient{ @Override //WebView代表是当前的WebView public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { //表示在当前的WebView继续打开网页 view.loadUrl(request.getUrl().toString()); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); Log.d("WebView","开始访问网页"); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); Log.d("WebView","访问网页结束"); } }}
运行应用程序,现在就可以正常的浏览网页了,不会出现让你用别的浏览器打开:
并且当你打开一个网页时,打印出开始访问网页,加载网打印访问网页结束?
但是此时我们按返回按键,直接退出当前的Activity,而不是回到上一个网页:
一按返回键就直接退出了这个Activity,我们需要的是如果后面还有网页只需要后退一步,并不需要退出这个Activity:如何修改?
我们需要去复写onKeyDown()函数:
现在再次浏览网页,返回就是返回上一个页面,而不是直接退出了。
显示网页Title监听网页进度
继承WebChromeClient这个类,复写里面常用的方法,设置网页标题:
运行应用程序:
整体代码:
package com.example.yuan.e06_gridview.WebView;import android.graphics.Bitmap;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.KeyEvent;import android.webkit.WebChromeClient;import android.webkit.WebResourceRequest;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Button;import com.example.yuan.e05_listview.R;public class WebViewActivity extends AppCompatActivity { //声明引用 private WebView mWVmhtml; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); //获取控件对象 mWVmhtml=(WebView) findViewById(R.id.WV_Id); //加载本地html文件 // mWVmhtml.loadUrl("file:///android_asset/hello.html"); //加载网络URL //mWVmhtml.loadUrl("https://blog.csdn.net/qq_36243942/article/details/82187204"); //设置JavaScrip mWVmhtml.getSettings().setJavaScriptEnabled(true); //访问百度首页 mWVmhtml.loadUrl("https://m.baidu.com"); //设置在当前WebView继续加载网页 mWVmhtml.setWebViewClient(new MyWebViewClient()); mWVmhtml.setWebChromeClient(new MyWebChromeClient()); } class MyWebViewClient extends WebViewClient{ @Override //WebView代表是当前的WebView public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { //表示在当前的WebView继续打开网页 view.loadUrl(request.getUrl().toString()); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); Log.d("WebView","开始访问网页"); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); Log.d("WebView","访问网页结束"); } } class MyWebChromeClient extends WebChromeClient{ @Override //监听加载进度 public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); } @Override//接受网页标题 public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); //把当前的Title设置到Activity的title上显示 setTitle(title); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { //如果按返回键,此时WebView网页可以后退 if (keyCode==KeyEvent.KEYCODE_BACK&&mWVmhtml.canGoBack()){ mWVmhtml.goBack(); return true; } return super.onKeyDown(keyCode, event); }}
更多相关文章
- Android(安卓)数据存储和文件使用案例分析
- android 使用AsyncTask实现异步下载文件
- android实现View的渐隐渐现功能
- android 热修复之类加载机制
- cordova操作Android本地文件系统
- Adapter
- Chrome V8 引擎移植到 Android
- Android使用Google Breakpad进行崩溃日志管理
- Android(安卓)三言两语