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

猜你喜欢

转载自blog.csdn.net/qq_36243942/article/details/82252289