Android之WebView使用技巧

WebView 设置实现两个手指缩放网页:

mWebView.getSettings().setSupportZoom(true);   //缩放开关
mWebView.getSettings().setBuiltInZoomControls(true);  // 设置是否可缩放

//设置加载进来的页面自适应手机屏幕,并且WebView双击变大,再双击后变小,当手动放大后,双击可以恢复到原始大小
settings.setLoadWithOverviewMode(true);  //设置WebView 可以加载更多格式页面  
settings.setUseWideViewPort(true);    //无限缩放   设置此属性,可任意比例缩放。

:1、初始缩放值可这样设置:webView.setInitialScale(initalValue);
2、缩放后,要使内容适配屏幕,不超出屏幕外显示,实现换行。这方面效果应该由html控制,而不是webview控制。
例如<p style="word-break:break-all">test</p>实现自动换行。

WebView cookies清理:

  CookieSyncManager.createInstance(this); 
  CookieSyncManager.getInstance().startSync(); 
  CookieManager.getInstance().removeSessionCookie(); 

另外,清理cache 和历史记录的方法

WebView.clearCache(true); 
WebView.clearHistory();

Android判断WebView是否已经滚动到页面底端:
getScrollY()方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离.
getHeight()或者getBottom()方法都返回当前WebView 这个容器的高度
getContentHeight 返回的是整个html 的高度,但并不等同于当前整个页面的高度,因为WebView 有缩放功能, 所以当前整个页面的高度实际上应该是原始html 的高度再乘上缩放比例. 因此,更正后的结果,准确的判断方法应该是:

if(WebView.getContentHeight*WebView.getScale() == (webview.getHeight()+WebView.getScrollY())){ //已经处于底端 }

调用WebView的loadUrl()方法,设置WevView要显示的网页:

互联网用:webView.loadUrl("http://www.google.com"); 
本地文件用:webView.loadUrl("file:///android_asset/XX.html"); 本地文件存放       在:assets 文件中

用WebView点链接看了很多页以后为了让WebView支持回退功能,需要覆盖覆盖Activity类的onKeyDown()方法,如果不做任何处理,点击系统回退剪键,整个浏览器会调用finish()而结束自身,而不是回退到上一页面

@Override 
//设置回退  
//覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法  
public boolean onKeyDown(int keyCode, KeyEvent event) {  
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {  
            webview.goBack(); //goBack()表示返回WebView的上一页面  
            return true;  
        }  
        return false;  
} 

设置WebView属性,能够执行Javascript脚本

webview.getSettings().setJavaScriptEnabled(true); 

WebView常用的一些方法:

// 设置WebView属性,能够执行Javascript脚本  
webview.getSettings().setJavaScriptEnabled(true);  

//设置WebView 可以加载更多格式页面  
webview.getSettings().setLoadWithOverviewMode(true);  

//设置WebView使用广泛的视窗  
webview.getSettings().setUseWideViewPort(true);  

//设置WebView的用户代理字符串。如果字符串“ua”是null或空,它将使用系统默认的用户代理字符串  
webview.getSettings().setUserAgentString();  

//支持手势缩放  
webview.getSettings().setBuiltInZoomControls(true);  

//支持2.2以上所有版本  
webview.getSettings().setPluginState(PluginState.ON);  

//告诉webview启用应用程序缓存api。  
webview.getSettings().setAppCacheEnabled(true);  

//设置是否启用了DOM storage API。  
webview.getSettings().setDomStorageEnabled(true);  

//自动打开窗口  
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 

// 没有的话会黑屏 支持插件  
webView.getSettings().setPluginsEnabled(true);  


/** 
 * setAllowFileAccess 启用或禁止
 * WebView访问文件数据 
 * setBlockNetworkImage 是否显示网络图像 
 * setBuiltInZoomControls 设置是否支持缩放 
 * setCacheMode 设置缓冲的模式 
 * setDefaultFontSize 设置默认的字体大小
 * setDefaultTextEncodingName 设置在解码时使用的默认编码 
 * setFixedFontFamily 设置固定使用的字体 
 * setJavaSciptEnabled 设置是否支持Javascript 
 * setLayoutAlgorithm 设置布局方式 
 * setLightTouchEnabled 设置用鼠标激活被选项 
 * setSupportZoom 设置是否支持变焦 
 * setPluginsEnabled(true) ;//支持插件
 * setUserWideViewPort(false) ;//将图片调整到适合webview的大小
 * setSupportZoom(true) ;//支持缩放
 * setLayoutAlgorithm(LayoutAlgrithm.SINGLE_COLUMN) ;//支持内容从新布局
 * supportMultipleWindows() ;//多窗口
 * setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK) ;//关闭webview中缓存
 * setAllowFileAccess(true) ;//设置可以访问文件
 * setNeedInitialFocus(true) ;//当webview调用requestFocus时为webview设置节点
 * setjavaScriptCanOpenWindowsAutomatically(true) ;//支持通过JS打开新窗口
 * setLoadsImagesAutomatically(true) ;//支持自动加载图片
 * 
 * webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);//设置滚动条隐藏 
 * webView.getSettings().setGeolocationEnabled(true);//启用地理定位

 * webView.getSettings().setRenderPriority(RenderPriority.HIGH);//设置渲染优先级

 * String dir = "/sdcard/temp";
 * webView.getSettings().setGeolocationDatabasePath(dir);//设置定位的数据库路径 
 * 
 * 这里是使用webview以及webview的相关设置,课根据实际情况进行设置.
 * WebViewClient的方法全解
 * 
 * doUpdateVisitedHistory(WebView view, String url ,boolean isReload) //更新历史记录

 * onFormResubmission(WebView view, Message dontResend, Message resend)//应用程序重新请求页面数据

 * onLoadResource(WebView view, String url)//在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次

 * onPageStarted(WebView view, String url, Bitmap favicon)//这个事件就是开始载入页面调用的,通常我们可以在这个设定一个loading的    页面,告诉用户程序在等待网络相应。

 * onPageFinished(WebView view, String url)//在页面加载结束时调用,同样道理,我们知道一个页面载入完成,于是我们可以关闭loading条,切   * 换程序动作。
 * 
 * onReceivedError(WebView view, int errorCode, String description, String failingUrl)
 * 报告错误信息onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,Stirng realm)
 * 
 * 获取返回信息授权请求onScaleChanged(WebView view, float oldScale, float newScale)WebView 发生改变时调用
 * 
 * onUnhandledKeyEvent(WebView view, KeyEvent event)key事件未被加载时调用
 * 
 * shouldOverrideUrlLoading并不是每次都在onPageStarted之前开始调用的,就是说一个新的URL不是每次都经过
 * shouldOverrideUrlLoading的,只有在调用webview.loadURL的时候才会调用。
 * */  
 * 
// 排版适应屏幕  
webView.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

// 设置Web视图 注意以下两个方法十分重要,很多需要重写:  
//首先设置自定义的WebChromeClient来设置视频播放的一些问题  
webView.setWebChromeClient(new DefaultWebChromeClient());  
webView.setWebViewClient(new DefaultWebViewClientClient()); //设置在同一个webview中打开新的网页

第一个方法:WebChromeClient:

//要重写其中的onShowCustomView 方法 表示进入全屏的时候,以及onHideCustomView 表示退出全屏的时候
界面的话,就是一个webview ,一个FrameLayout ,当全屏的时候就设置webview 隐藏,让FrameLayout全屏显示出来,那么视频就自动跑到FrameLayout这里面放了。退出全屏的时候,一样道理,这里要用到回调函数,自己理解吧。。。我讲的不好。。。

private class DefaultWebChromeClient extends WebChromeClient {  
        // 一个回调接口使用的主机应用程序通知当前页面的自定义视图已被撤职  
        CustomViewCallback customViewCallback;  
        // 进入全屏的时候  
        @Override  
        public void onShowCustomView(View view, CustomViewCallback callback) {  
            // 赋值给callback  
            customViewCallback = callback;  
            // 设置webView隐藏  
            webview.setVisibility(View.GONE);  
            // 声明video,把之后的视频放到这里面去  
            FrameLayout video = (FrameLayout) findViewById(R.id.video);  
            // 将video放到当前视图中  
            video.addView(view);  
            // 横屏显示  
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
            // 设置全屏  
            setFullScreen();  
        }  
        // 退出全屏的时候  
        @Override  
        public void onHideCustomView() {  
            if (customViewCallback != null) {  
                // 隐藏掉  
                customViewCallback.onCustomViewHidden();  
            }  
            // 用户当前的首选方向  
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER);  
            // 退出全屏  
            quitFullScreen();  
            // 设置WebView可见  
            webview.setVisibility(View.VISIBLE);  
        }  

        //设置网页加载的进度条
        @Override  
        public void onProgressChanged(WebView view, int newProgress) { 
            MainAcitivity.this.getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress * 100); 
            super.onProgressChanged(view, newProgress);  
        }  

        //设置应用程序的标题
        public void onReceivedTitle(WebView view, String title) {
            MainAcitivity.this.setTitle(title);
            super.onReceivedTitle(view, title);
        }
    }  

下面是两个方法,设置全屏和退出全屏的方法:注意,我捕捉到了,全屏状态下和窗口状态下他们分别的Flags数值。可见如下代码

/** 
     * 设置全屏 
     */  
    private void setFullScreen() {  
        // 设置全屏的相关属性,获取当前的屏幕状态,然后设置全屏  
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
                WindowManager.LayoutParams.FLAG_FULLSCREEN);  
        // 全屏下的状态码:1098974464  
        // 窗口下的状态吗:1098973440  
    }  

    /** 
     * 退出全屏 
     */  
    private void quitFullScreen() {  
        // 声明当前屏幕状态的参数并获取  
        final WindowManager.LayoutParams attrs = getWindow().getAttributes();  
        attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);  
        getWindow().setAttributes(attrs);  
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);  
    }  

第二个自定义的WebViewClient,继承WebViewClient

/** 
     * 使用系统默认webview 
     */  
    private class DefaultWebViewClientClient extends WebViewClient {  
        @Override  
        public boolean shouldOverrideUrlLoading(WebView view, String url) {  
            return super.shouldOverrideUrlLoading(view, url);  
            //如果要下载页面中的游戏或者继续点击网页中的链接进入下一个网页的话,重写此方法下,不然就会跳到手机自带的浏览器了,而不继续在你这个webview里面展现了  
        }  

        @Override  
        public void onReceivedError(WebView view, int errorCode,  
                String description, String failingUrl) {  
       //想在收到错误信息的时候,执行一些操作,走此方法  
        }  

        @Override  
        public void onPageStarted(WebView view, String url, Bitmap favicon) {  
            super.onPageStarted(view, url, favicon);  
            //想在页面开始加载的时候,执行一些操作,走此方法  
        }  

        @Override  
        public void onPageFinished(WebView view, String url) {  
            super.onPageFinished(view, url);  
            //想在页面加载结束的时候,执行一些操作,走此方法  
        }  
    }  

最后还有一点很重要,要想进入同过webview浏览网页,而且点返回键是想在webview中返回,而不是直接退出程序,那么就得重写onKeyDown方法。还有

@Override  
    public boolean onKeyDown(int keyCode, KeyEvent event) {  

        if (keyCode == KeyEvent.KEYCODE_BACK) {  
                        WebView webView = (WebView) findViewById(R.id.webview_passenger);  
                        if (webView.canGoBack()) {  
                            // goBack()表示返回WebView的上一页面  
                            webView.goBack();  
                            //退出全屏  
                            quitFullScreen();  
                        } else {  

                        }  
            return true;  
        }  
        return super.onKeyDown(keyCode, event);  
    }  

Demo下载地址:http://download.csdn.net/detail/lygscg123/7673123

安卓与Html交互的控件功能:

package my.demo;
import my.demo.R;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.webkit.WebView;
import android.widget.TextView;
import android.widget.Toast;


public class JavaScriptInterfaceDemoActivity extends Activity {
    private WebView Wv;
    private TextView myTextView;    
    final Handler myHandler = new Handler();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);
        Wv = (WebView)findViewById(R.id.webView1);
        myTextView = (TextView)findViewById(R.id.textView1);        
        final JavaScriptInterface myJavaScriptInterface
        = new JavaScriptInterface(this);         

        Wv.getSettings().setLightTouchEnabled(true);
        Wv.getSettings().setJavaScriptEnabled(true);
        Wv.addJavascriptInterface(myJavaScriptInterface, "AndroidFunction");
        Wv.loadUrl("file:///android_asset/www/index.html"); 
    }

    public class JavaScriptInterface {
        Context mContext;

        JavaScriptInterface(Context c) {
            mContext = c;
        }

        public void showToast(String webMessage){           
            final String msgeToast = webMessage;            
             myHandler.post(new Runnable() {
                 @Override
                 public void run() {
                     // This gets executed on the UI thread so it can safely modify Views
                     myTextView.setText(msgeToast);
                 }
             });

           Toast.makeText(mContext, webMessage, Toast.LENGTH_SHORT).show();
        }
    }
}

在Java类文件中,我们已经将一些代码写入到oncreate方式。在这个方式中,我们用findViewById方式找到webview 和textview控制。然后创建一个JavaScriptInterface类。该类有一个构建函数,该函数初始化Context类。那么,什么是Context类呢?

Context类是一个抽象类,它允许访问特定应用资源和类,以及调用应用程序级操作,诸如发起活动、广播和接收意图等。

在构建函数初始化后,创建一个名为showToast的方式,该方式有一个变量的msgeToast字符串,然后创建一个名为myHandler的Handler(处理器)。该处理器有一个Post方式,在该方式的声明中,创建一个新的可运行线程类的实例,在这个类里覆盖一个运行方式,该运行方式设置textview控制的值。

现在在OnCreate方式中创建一个JavaScriptInterface实例。

在JavaScriptInterface类初始化之后,添加一行到OnCreate方式。

final JavaScriptInterface myJavaScriptInterface = new JavaScriptInterface(this);
webview提供addJavascriptInterface方式。该方式包含两项参数:

绑定到JavaScript的类实例。
用来显示JavaScript中的实例的名称。
对于webview,我们需要弟阿勇一些设置来启用JavaScript。

Wv.addJavascriptInterface(myJavaScriptInterface, “AndroidFunction”);
最后,需要在webview中提供一个web URL:

Wv.loadUrl(“file:///android_asset/www/index.html”);
然后创建一个命名为index.html的HTML文件。该HTML有一个文本框和一个提交按钮。HTML文件代码如下:

&lt!DOCTYPE >
&lthtml xmlns="http://www.w3.org/1999/xhtml" debug="true">
    &lthead>
        &ltmeta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        &ltmeta name="viewport" 
          content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        &ltmeta name="apple-mobile-web-app-capable" content="yes">
        &ltmeta name="viewport" content="target-densitydpi=device-dpi" />
        &ltscript type="text/javascript">
           function init()
           {
               var testVal = document.getElementById('mytextId').value;
               AndroidFunction.showToast(testVal);
           }
        &lt/script>
    &lt/head>
    &ltbody>        
        &ltdiv style="float: left;width: 50%;">
           &ltinput type="text" style="width: 180px;" 
                   name="myText" id="mytextId" />

        &lt/div>
        &ltdiv style="clear: both;height: 3px;"> &lt/div>
        &ltdiv>
          &ltinput value="submit" type="button" name="submit" 
            id="btnSubmit" onclick="javascript:return init();" /> 
        &lt/div>  
    &lt/body>
&lt/html>

该HTML文件有一个JavaScript函数名为init,该函数调用活动方式。

AndroidFunction.showToast(testVal);
AndroidFunction是同样的名字,用来显示JavaScript中的实例。我们已经在addJavascriptInterface方式中给出该名字。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值