«

WebView加载本地加载网络资源

时间:2024-3-2 19:43     作者:韩俊     分类: Android


Android webview使用详解

  1. 打开网页时不调用系统浏览器, 而是在本WebView中显示:





    复制代码

    mWebView.setWebViewClient(new WebViewClient(){

    @Override

    public boolean shouldOverrideUrlLoading(WebView view, String url) {

    view.loadUrl(url);

    return true;

    }

    });

    复制代码
  2. 通过java代码调用javascript





    复制代码

    WebSettings webSettings = mWebView .getSettings();

    webSettings.setJavaScriptEnabled(true);

    mWebView.addJavascriptInterface(new Object() {

    public void clickOnAndroid() {

    mHandler.post(new Runnable() {

    public void run() {

    webview.loadUrl("javascript:wave()");

    }

    });

    }

    }, "demo");

    复制代码
  3. 按返回键时, 不退出程序而是返回上一浏览页面:





    复制代码

    public boolean onKeyDown(int keyCode, KeyEvent event) {

    if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {

    webview.goBack();

    return true;

    }

    return super.onKeyDown(keyCode, event);

    }

    复制代码
  4. 打开页面时, 自适应屏幕:





    WebSettings webSettings = mWebView .getSettings();

    webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放

    webSettings.setLoadWithOverviewMode(true);
  5. 便页面支持缩放:





    WebSettings webSettings = mWebView .getSettings();

    webSettings.setJavaScriptEnabled(true);

    webSettings.setBuiltInZoomControls(true);

    webSettings.setSupportZoom(true);

    6.如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。





    webview.requestFocusFromTouch();

    7.WebView 加载界面主要调用三个方法:LoadUrl、LoadData、LoadDataWithBaseURL.





    1、LoadUrl 直接加载网页、图片并显示.(本地或是网络上的网页、图片、gif)

    2、LoadData 显示文字与图片内容 (模拟器1.5、1.6)

    3、LoadDataWithBase 显示文字与图片内容(支持多个模拟器版本)

    8.WebSettings 的常用方法介绍





    复制代码

    setJavaScriptEnabled(true); //支持js





    setPluginsEnabled(true); //支持插件





    setUseWideViewPort(false); //将图片调整到适合webview的大小





    setSupportZoom(true); //支持缩放





    setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局





    supportMultipleWindows(); //多窗口





    setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存





    setAllowFileAccess(true); //设置可以访问文件





    setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点





    webview webSettings.setBuiltInZoomControls(true); //设置支持缩放





    setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口





    setLoadWithOverviewMode(true); // 缩放至屏幕的大小





    setLoadsImagesAutomatically(true); //支持自动加载图片

    复制代码

    9.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,String realm)//(获取返回信息授权请求)



    onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) //重写此方法可以让webview处理https请求。



    onScaleChanged(WebView view, float oldScale, float newScale) // (WebView发生改变时调用)





    onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加载时调用)





    shouldOverrideKeyEvent(WebView view, KeyEvent event)//重写此方法才能够处理在浏览器中的按键事件。





    shouldOverrideUrlLoading(WebView view, String url)

//在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。



1.webview布局文件main.xml

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

2.MyActivity.class文件

package com.ncsyeyy.WebViewDemo;

import android.app.Activity;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.KeyEvent;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.net.URLEncoder;

public class MyActivity extends Activity {
    /**
     * WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用。
     webview有两个方法:setWebChromeClient 和 setWebClient
     setWebClient:主要处理解析,渲染网页等浏览器做的事情
     setWebChromeClient:辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等
     WebViewClient就是帮助WebView处理各种通知、请求事件的。
     * 1、webview支持页面缩放,一般通过以下设置就可满足80%的要求
     //缩放开关
     webView.getSettings().setSupportZoom(true);
     设置此属性,仅支持双击缩放,不支持触摸缩放(在android4.0是这样,其他平台没试过)
     // 设置是否可缩放
     webView.getSettings().setBuiltInZoomControls(true);
     如果设置了此属性,那么webView.getSettings().setSupportZoom(true);也默认设置为true
     2、无限缩放
     无限缩放,就需要使用大视图模式,如下:
     //无限缩放
     webView.getSettings().setUseWideViewPort(true);设置此属性,可任意比例缩放。
     注:1、初始缩放值可这样设置:webView.setInitialScale(initalValue);
     2、缩放后,要使内容适配屏幕,不超出屏幕外显示,实现换行。这方面效果应该由html控制,而不是webview控制。
     例如<p style="word-break:break-all">test</p>实现自动换行。
     */

    private WebView webView;

    @SuppressLint("SetJavaScriptEnabled")

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        webView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings=webView.getSettings();
//        设置WebView属性,能够执行JavaScript脚本
        webSettings.setJavaScriptEnabled(true);
//        设置可以访问的文件
        webSettings.setAllowFileAccess(true);
//        设置是否支持缩放
        webSettings.setBuiltInZoomControls(true);

//        webView.getSettings().setBuiltInZoomControls(true);
//        缩放开关
        webSettings.setSupportZoom(true);
        webSettings.setUseWideViewPort(true);//可以任意比例缩放
        webSettings.setPluginState(WebSettings.PluginState.ON);
        webView.setSaveEnabled(true);//支持插件
        //使用localStorage(本地存储)则必须打开
        webSettings.setDomStorageEnabled(true);

//        加载需要显示的网页本地,网络都可以,只需要把地址换一下即可
        webView.loadUrl("file:///sdcard/ebook/mntusadmin/935867ec1f094f4e900a9920c4822e79/quiz/data/a14c682cab7a4d72b3296f4d14fd59fd/index.html?user_id=226e56111f8949329623a4dfc539dc51&client_type=android&style_type=Formative&Authorization=mntusadmin|6efbd902c18cfc84701d3bf915bcfc012fb1e7d258204b5b136e23e968fc877b7922572d7a6e08b339acfc2b34c3c9b5675c45cafa137211e9f07429636dea91&Language=zh-CN&admin_flag=Y");
//        打开网页时不调用系统浏览器,二十在本webview中显示设置web视图
        webView.setWebViewClient(new webViewClient());

    }

//设置回退,覆盖activity类的onKeyDown(int keyCode,KeyEvent event)方法
//   按返回键是,不退出程序而是返回上一浏览页面
    @Override
    public boolean onKeyDown(int keyCode,KeyEvent event){
if ((keyCode==KeyEvent.KEYCODE_BACK)&&webView.canGoBack()){
    webView.goBack();
    return true;
}
        finish();
        return false;
    }
    //Web视图
    private class webViewClient extends WebViewClient {
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
            return true;
        }
    }
}

3.AndroidManifest.xml权限的配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.ncsyeyy.WebViewDemo"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="18"/>
    <!--添加访问网络权限-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- 允许应用访问精确(如GPS)性的定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!--允许应用访问范围(如WIFI)性的定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name="MyActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>



标签: android

热门推荐