美文网首页AndroidAndroid开发Android开发经验谈
android自定义浏览器(WebView的使用)

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

作者: 厚土火焱 | 来源:发表于2017-08-25 14:22 被阅读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

    相关文章

      网友评论

      • 无心下棋:还有https的
        厚土火焱:private String uriHttpFirst(String strUri) 在这里做了个地址栏是否设定了协议的判断。
        厚土火焱:@无心下棋 在我们使用http访问一个网站的时候,如果这个网站是https的,会自动更改为https。这是一般使用https的网站都会做的事情。
      • 厚土火焱:由于之前的一版,没有考虑网络协议的判断,所以,当用户习惯性的只写域名的时候,浏览器无法打开网站。因此,今天补充进去一个判断增加协议的方法。(原有疏漏,见谅。)

      本文标题:android自定义浏览器(WebView的使用)

      本文链接:https://www.haomeiwen.com/subject/tqpudxtx.html