Android使用WebView, WebChromeClient和WebViewClient加载网页
2015-09-25 16:34
811 查看
package com.lei.chenmei; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; import android.widget.TextView; import java.net.URL; /** * Created by renlei * DATE: 15-9-25 * Time: 下午3:04 * Email: renlei0109@yeah.net */ public class WebViewTestActivity extends Activity { private WebView webView; private String mUrl; private String mTitle; private View rootView; private TextView titleTV; private ProgressBar progressBar; public static final String WEB_URL = "web_url"; public static final String TITLE = "title"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); rootView = View.inflate(this, R.layout.webviewtest, null); setContentView(rootView); getData(); initWebView(); } /** * 获取数据 */ private void getData() { Intent intent = getIntent(); if (intent != null) { if (intent.getStringExtra(WEB_URL) != null && intent.getStringExtra(TITLE) != null) { mUrl = intent.getStringExtra(WEB_URL); mTitle = intent.getStringExtra(TITLE); } } } /** * 初始化webview */ private void initWebView() { Log.d("renlei", "initWebView"); webView = (WebView) rootView.findViewById(R.id.web_view); progressBar = (ProgressBar) rootView.findViewById(R.id.progressbar); titleTV = (TextView) rootView.findViewById(R.id.title); webView.setWebViewClient(new MyWebViewClient()); webView.setWebChromeClient(new MyWebChromeClient()); if (mUrl != null) { Log.d("renlei", "initWebView" + " webView.loadUrl(mUrl) " + mUrl); webView.loadUrl(mUrl); } webView.requestFocusFromTouch();//如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。 //打开页面时, 自适应屏幕: WebSettings webSettings = webView.getSettings(); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); //支持javascript webSettings.setJavaScriptEnabled(true); //便页面支持缩放: webSettings.setBuiltInZoomControls(true); webSettings.setSupportZoom(true); /** * 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); //支持自动加载图片 */ } /** * 监测返回键 * * @param keyCode * @param event * @return */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (webView.canGoBack()) { webView.goBack(); Log.d("renlei", "webview goback"); } else { // 按返回的时候, 先关闭可能打开的软键盘, 再返回上一页 InputMethodManager imm = (InputMethodManager) (getSystemService(Context.INPUT_METHOD_SERVICE)); imm.hideSoftInputFromWindow(webView.getWindowToken(), 0); WebViewTestActivity.this.finish(); } return true; } return false; } /** * MyWebViewClient 中各方法的作用 * <p/> * doUpdateVisitedHistory(WebView view, String url, boolean isReload) //(更新历史记录) * <p/> * onFormResubmission(WebView view, Message dontResend, Message resend) //(应用程序重新请求网页数据) * <p/> * onLoadResource(WebView view, String url) // 在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。 * <p/> * onPageStarted(WebView view, String url, Bitmap favicon) //这个事件就是开始载入页面调用的,通常我们可以在这设定一个loading的页面,告诉用户程序在等待网络响应。 * <p/> * onPageFinished(WebView view, String url) //在页面加载结束时调用。同样道理,我们知道一个页面载入完成,于是我们可以关闭loading 条,切换程序动作。 * <p/> * onReceivedError(WebView view, int errorCode, String description, String failingUrl)// (报告错误信息) * <p/> * onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host,String realm)//(获取返回信息授权请求) * <p/> * onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) //重写此方法可以让webview处理https请求。 * <p/> * onScaleChanged(WebView view, float oldScale, float newScale) // (WebView发生改变时调用) * <p/> * onUnhandledKeyEvent(WebView view, KeyEvent event) //(Key事件未被加载时调用) * <p/> * shouldOverrideKeyEvent(WebView view, KeyEvent event)//重写此方法才能够处理在浏览器中的按键事件。 * <p/> * shouldOverrideUrlLoading(WebView view, String url) * //在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。这个函数我们可以做很多操作,比如我们读取到某些特殊的URL,于是就可以不打开地址,取消这个操作,进行预先定义的其他操作,这对一个程序是非常必要的。 */ private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.d("renlei", "shouldOverrideUrlLoading" + url); /** *真正是在这里进行加载的 */ view.loadUrl(url); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.v("renlei", "onPageStarted(), url:" + url); progressBar.setVisibility(View.VISIBLE); } } private class MyWebChromeClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); Log.d("renlei", "onProgressChanged" + newProgress); progressBar.setProgress(newProgress); if (newProgress == 100) { progressBar.setVisibility(View.GONE); } } @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); if (title != null) { titleTV.setText(title); Log.d("renlei", "onReceivedTitle" + title); } } } }
布局
<?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"
>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="50dp"
>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="title"
android:textSize="20sp"
android:layout_centerVertical="true"
android:layout_centerInParent="true"/>
</RelativeLayout>
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="fill_parent"
android:layout_height="5dp"
style="?android:attr/progressBarStyleHorizontal"/>
<WebView
android:id="@+id/web_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"></WebView>
</LinearLayout>
相关文章推荐
- Android中WebChromeClient和WebViewClient的区别浅析
- android webview 获取Geolocation
- Android与WebView的同步和异步访问机制
- Android中WebViewClient与WebChromClient两个类的区别
- webview与js交互2
- Android WebView属性及用法
- WebView的分析与使用
- WebView实战与设计
- Android性能专项测试之Heap Viewer工具
- 爱加密推出XcodeGhost解决方案 护APP安全
- Swift - 使用xib添加新界面
- Swift - 浮点数转换成整数(四舍五入与直接截断)
- Nagios+pnp4nagios安装日记
- Swift - 让StoryBoard设计视图,程序运行时都使用横屏形式
- Android中LayoutParams总结和用法
- Android Lollipop 新特性 - Palette
- Swift - 导航条(UINavigationBar)的使用
- Swift - 环形进度条(UIActivityIndicatorView)的用法
- android 软键盘设置
- Swift - 时间控制器NSTimer(每隔一定时间执行某个函数)