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);    }}

 


 

更多相关文章

  1. Android(安卓)数据存储和文件使用案例分析
  2. android 使用AsyncTask实现异步下载文件
  3. android实现View的渐隐渐现功能
  4. android 热修复之类加载机制
  5. cordova操作Android本地文件系统
  6. Adapter
  7. Chrome V8 引擎移植到 Android
  8. Android使用Google Breakpad进行崩溃日志管理
  9. Android(安卓)三言两语

随机推荐

  1. 【Android】TabLayout 自定义指示器 Indi
  2. Android,一个函数实现上传文件(单个,多文
  3. android通过蓝牙实现两台手机传输数据
  4. 仿淘宝商品详情页面Android
  5. Android简单记录和恢复ListView滚动位置
  6. Android(安卓)init.rc文件解析过程详解(
  7. Android(安卓)studio 自动生成带系统权限
  8. Android(安卓)使用PDF.js浏览pdf的方法示
  9. AndroidManifest.xml中android:label标签
  10. Android(安卓)Jetpack 之 LifeCycle