用WebVie实现简单的浏览器功能

来源:互联网 发布:昆山java招聘 编辑:程序博客网 时间:2024/05/23 02:02

WebView简单的来说就是把Web页面嵌入到我们的手机屏幕中。


现在来实现一下 。


首先还是看下布局文件:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="match_parent">    <WebView        android:id="@+id/webView"        android:layout_width="match_parent"        android:layout_height="match_parent"/></LinearLayout>

这里注意一点,为了我们的web页面能够全屏显示,我们需要设置layout_width和layout_height为铺满全屏(match_parent)


这里看下activity的处理,首先代码已经全部写好了,先上代码:

package com.example.lolli.webview;import android.app.ProgressDialog;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.KeyEvent;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;public class MainActivity extends AppCompatActivity {    // 定义webView控件    private WebView webView;    //  定义一个加载进度条    private ProgressDialog progressDialog;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 初始化webView        webView = (WebView) findViewById(R.id.webView);        //获取webView设置        WebSettings setting = webView.getSettings();        //设置启用javascript        setting.setJavaScriptEnabled(true);        //设置加载优先使用缓存        setting.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);        //  设置url为百度首页        webView.loadUrl("http://www.baidu.com");        /**         * 监听web加载进度         */        webView.setWebChromeClient(new WebChromeClient(){            @Override            public void onProgressChanged(WebView view, int newProgress) {                //newProgress 1-100                if (newProgress==100){                    // 如果进度为100  》 判断当前是否有progressDialog且progressDialog正在显示 》 关闭progressDialog 设置progressDialog为null                    if (progressDialog!=null && progressDialog.isShowing()){                        progressDialog.dismiss();                        progressDialog = null;                    }                }else{                    // 判断是为为空 》  初始化progressDialog并设置样式为横向加载的样式 》设置进度 》设置显示                    if (progressDialog==null){                        progressDialog = new ProgressDialog(MainActivity.this);                        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);                        progressDialog.setTitle("页面加载进度");                        progressDialog.setProgress(newProgress);                        progressDialog.show();                    }else{                        progressDialog.setProgress(newProgress);                    }                }            }        });    }    /**     * 设置手机返回键作用,按返回键判断是否退出或到上个页面     * @param keyCode     * @param event     * @return     */    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        // 判断用户是否按下返回键        if (keyCode == KeyEvent.KEYCODE_BACK){            //  如果有返回的页面就返回,否则退出程序            if (webView.canGoBack()){                webView.goBack();                return true;            }else{                System.exit(0);            }        }        return super.onKeyDown(keyCode, event);    }}

现在来解释一下代码:

如果什么都不考虑,只想简单的显示web页面,我们只需要设置loadURL就可以了:

package com.example.lolli.webview;import android.app.ProgressDialog;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.KeyEvent;import android.webkit.WebChromeClient;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;public class MainActivity extends AppCompatActivity {    // 定义webView控件    private WebView webView;    //  定义一个加载进度条    private ProgressDialog progressDialog;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 初始化webView        webView = (WebView) findViewById(R.id.webView);        //  设置url为百度首页        webView.loadUrl("http://www.baidu.com");    }}


只需要如上代码即可。。。



这里为了增强用户体验:

我们首先打开了设置,并设置了对javascript的支持,一直为了更快,我们启用了有限加载缓存。

webView = (WebView) findViewById(R.id.webView);        //获取webView设置        WebSettings setting = webView.getSettings();        //设置启用javascript        setting.setJavaScriptEnabled(true);        //设置加载优先使用缓存        setting.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);

但是我们发现,我们点击一个链接,然后就是等待,如果等待时间很长的话用户可能会认为页面是不是死掉了 ,所以为了加强用户体验,我们设置加了一个页面加载的进度条。。。    设置WebChromeClient我们可能监听页面加载进度,然后得到一个newProgress,这里newProgress最大值是100,即加载完成,我们拿到这个值设置到progressDialog里面,就可以实现进度条显示与隐藏了。。

/**         * 监听web加载进度         */        webView.setWebChromeClient(new WebChromeClient(){            @Override            public void onProgressChanged(WebView view, int newProgress) {                //newProgress 1-100                if (newProgress==100){                    // 如果进度为100  》 判断当前是否有progressDialog且progressDialog正在显示 》 关闭progressDialog 设置progressDialog为null                    if (progressDialog!=null && progressDialog.isShowing()){                        progressDialog.dismiss();                        progressDialog = null;                    }                }else{                    // 判断是为为空 》  初始化progressDialog并设置样式为横向加载的样式 》设置进度 》设置显示                    if (progressDialog==null){                        progressDialog = new ProgressDialog(MainActivity.this);                        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);                        progressDialog.setTitle("页面加载进度");                        progressDialog.setProgress(newProgress);                        progressDialog.show();                    }else{                        progressDialog.setProgress(newProgress);                    }                }            }        });

还有一个细节,就是我们点击返回键的时候,不管在什么时候,他都会直接退出应用 ,这样显然是不好的 。

所以我们对返回键的按下做了处理:

/**     * 设置手机返回键作用,按返回键判断是否退出或到上个页面     * @param keyCode     * @param event     * @return     */    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        // 判断用户是否按下返回键        if (keyCode == KeyEvent.KEYCODE_BACK){            //  如果有返回的页面就返回,否则退出程序            if (webView.canGoBack()){                webView.goBack();                return true;            }else{                System.exit(0);            }        }        return super.onKeyDown(keyCode, event);    }

如此一来,整个webView的案例就ok了 。。



最后,最重要的一点 :::

这里我们访问了外网,所以我们必须加上访问外网的权限:::

我们必须在AndroidMainFest.xm里面加上这么一句:::

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

这章有写到一个没说过的东西,就是progreddDialog,其实他跟progressBar是一样的,我们只需设置值就可以让他进度条显示了,只是展现的方式不一样。。我们只需要增加写一遍,然后运行一下看下效果,很容易就明白了。。。




0 0