AndroidAndroid开发Android开发经验谈

android自定义浏览器(WebView的使用)

2017-08-25  本文已影响1351人  厚土火焱

很多时候,我们需要在自己的程序中展示一些网页。但是使用手机中的浏览器会让用户脱离你的程序。怎么办呢?只能是在自己的程序中加入浏览器的功能了。于是,我们需要用到 WebView 。
在程序中内嵌一个浏览器很容易。

    <WebView
        android:id="@+id/wbvw"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>

把这条语句写入 activity_main.xml 中即可。
然后在 MainActivity.java 中的 onCreate 里加上这两句

WebView webView = (WebView)findViewById(R.id.wbvw);
webView.getSettings().setJavaScriptEnabled(true);//让浏览器支持javascript
webView.setWebViewClient(new WebViewClient())
webView.loadUrl("http://www.baidu.com");

之后就是权限问题了,在 AndroidManifest.xml 中申请一下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cofox.mywebview">
    <uses-permission android:name="android.permission.INTERNET"/>
...

完成了。但是太简单了。
如果你只是内嵌一个网页,不需要对它做什么控制,这就算完成了。实际使用中你就去修改那个“百度的网址”就好了。
而我们今天还是给它实现基本的浏览器必备功能吧。所以,activity_main.xml 中加入了地址栏、转到按钮,还有首页、后退、前进、刷新按钮。
代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.cofox.mywebview.MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:orientation="horizontal">
        <EditText
            android:id="@+id/edtttUri"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:maxLines="1"
            android:scrollHorizontally="false"
            android:layout_weight="1"/>
        <Button
            android:id="@+id/btnGo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="转到"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/btnHome"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="首页"/>
        <Button
            android:id="@+id/btnBack"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="后退"/>
        <Button
            android:id="@+id/btnForeward"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="前进"/>
        <Button
            android:id="@+id/btnRefresh"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="刷新"/>

    </LinearLayout>
    <WebView
        android:id="@+id/wbvw"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>

</LinearLayout>

在 MainActivity.java 首先声明一个变量,用来存储默认首页网址

private String strUriHome = "http://www.baidu.com";//默认首页

顺便声明一下界面的各种控件

    WebView webView;//浏览器
    EditText edtttUri;//地址栏
    Button btnGo;//打开网页按钮
    Button btnHome;//首页按钮
    Button btnBack;//返回按钮
    Button btnForward;//前进按钮
    Button btnRefresh;//刷新按钮

在 onCreate 中实例化界面控件,并且监听 Click 事件。为了方便统一管理监听,在 Class 上需要扩展 implements View.OnClickListener

public class MainActivity extends AppCompatActivity implements View.OnClickListener
        webView = (WebView)findViewById(R.id.wbvw);
        edtttUri = (EditText)findViewById(R.id.edtttUri);
        btnGo = (Button)findViewById(R.id.btnGo);
        btnHome = (Button)findViewById(R.id.btnHome);
        btnBack = (Button)findViewById(R.id.btnBack);
        btnForward = (Button)findViewById(R.id.btnForeward);
        btnRefresh = (Button)findViewById(R.id.btnRefresh);
        webView.getSettings().setJavaScriptEnabled(true);//让浏览器支持javascript
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onLoadResource(WebView view, String url) {
                edtttUri.setText(view.getUrl());
                super.onLoadResource(view, url);
            }
        });  //当跳转网页时,仍在WebView中打开。
        webView.loadUrl(strUriHome);

        edtttUri.setText(strUriHome);

        btnGo.setOnClickListener(this);
        btnHome.setOnClickListener(this);
        btnBack.setOnClickListener(this);
        btnForward.setOnClickListener(this);
        btnRefresh.setOnClickListener(this);

onLoadResource 中的 edtttUri.setText(view.getUrl()) 是实现把当前页面的地址显示到地址栏功能。
统一的 onClick 功能实现了转到、首页、后退、前进、刷新。

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            //转到
            case R.id.btnGo:
                try {
                    String strUri = uriHttpFirst(edtttUri.getText().toString());//网址协议判断
                    webView.loadUrl(strUri);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            //首页
            case R.id.btnHome:
                try {
                    webView.loadUrl(strUriHome);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            //返回
            case R.id.btnBack:
                try {
                    webView.goBack();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            //前进
            case R.id.btnForeward:
                try {
                    webView.goForward();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            //刷新
            case R.id.btnRefresh:
                try {
                    webView.reload();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            default:
                break;
        }
    }

网络访问都是需要通过各种协议进行通讯的。网页浏览一般需要通过 http 协议或者 https 协议。(网络协议详细介绍请百度_
所以在访问某个网址前,我们需要先判断一下,地址是否添加了要使用的协议。如果没有就默认在地址前增加一个http的头。这个功能我们用一个 uriHttpFirst(String strUri) 方法来实现。

    //地址HTTP协议判断,无HTTP打头的,增加http://,并返回。
    private String uriHttpFirst(String strUri){

        if(strUri.indexOf("http://",0) != 0 && strUri.indexOf("https://",0) != 0 ){
            strUri = "http://" + strUri;
        }

        return strUri;
    }

互联网访问权限已经申请过了。就不重复了。
看一下 MainActivity.java的完整代码

package com.cofox.mywebview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private String strUriHome = "http://www.baidu.com";//默认首页
    WebView webView;//浏览器
    EditText edtttUri;//地址栏
    Button btnGo;//打开网页按钮
    Button btnHome;//首页按钮
    Button btnBack;//返回按钮
    Button btnForward;//前进按钮
    Button btnRefresh;//刷新按钮

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

        webView = (WebView)findViewById(R.id.wbvw);
        edtttUri = (EditText)findViewById(R.id.edtttUri);
        btnGo = (Button)findViewById(R.id.btnGo);
        btnHome = (Button)findViewById(R.id.btnHome);
        btnBack = (Button)findViewById(R.id.btnBack);
        btnForward = (Button)findViewById(R.id.btnForeward);
        btnRefresh = (Button)findViewById(R.id.btnRefresh);

        webView.getSettings().setJavaScriptEnabled(true);//让浏览器支持javascript
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onLoadResource(WebView view, String url) {
                edtttUri.setText(view.getUrl());//当前WebView网址更新显示到地址栏
                super.onLoadResource(view, url);
            }
        });  //当跳转网页时,仍在WebView中打开。
        webView.loadUrl(strUriHome);

        edtttUri.setText(strUriHome);

        btnGo.setOnClickListener(this);
        btnHome.setOnClickListener(this);
        btnBack.setOnClickListener(this);
        btnForward.setOnClickListener(this);
        btnRefresh.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            //转到
            case R.id.btnGo:
                try {
                    String strUri = uriHttpFirst(edtttUri.getText().toString());//网址协议判断
                    webView.loadUrl(strUri);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            //首页
            case R.id.btnHome:
                try {
                    webView.loadUrl(strUriHome);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            //返回
            case R.id.btnBack:
                try {
                    webView.goBack();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            //前进
            case R.id.btnForeward:
                try {
                    webView.goForward();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            //刷新
            case R.id.btnRefresh:
                try {
                    webView.reload();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            default:
                break;
        }
    }
    //地址HTTP协议判断,无HTTP打头的,增加http://,并返回。
    private String uriHttpFirst(String strUri){

        if(strUri.indexOf("http://",0) != 0 && strUri.indexOf("https://",0) != 0 ){
            strUri = "http://" + strUri;
        }

        return strUri;
    }


}

运行效果图

MyWebView
上一篇下一篇

猜你喜欢

热点阅读