android WebView(五)WebChromeClient
WebView诸如获取页面的title、响应js中的alert、获取页面的加载进度等都可以通过设置WebChromeClient来实现。
首先来看一下设置WebChromeClient的代码:
webchromeclient = new SelfWebChromeClient( progressBar); webView.setWebChromeClient(webchromeclient);SelfWebChromeClient继承自WebChromeClient :
class SelfWebChromeClient extends WebChromeClient {}
WebView获取页面title
需要继承并实现WebChromeClient的onReceivedTitle方法@Override public void onReceivedTitle(WebView view, String title) { titleText.setText(title); }此方法返回了页面的title,你可以在此方法体内展示此title信息。
WebView获取页面的加载进度
需要继承并实现WebChromeClient的onProgressChanged方法
@Override public void onProgressChanged(WebView view, int newProgress) { // 当WebView进度改变时更新窗口进 if (progressbar.getVisibility() != View.VISIBLE&&newProgress != 100) { progressbar.setVisibility(View.VISIBLE); } progressbar.setProgress(newProgress); super.onProgressChanged(view, newProgress); }
此方法返回了页面加载的进度newProgress。
WebView响应js中的alert
加入你的html页面中调用了下面的js:alert("大家好");这时候需要如何来处理呢?WebChromeClient提供了回调方法onJsAlert,继承并实现此方法,在此方法体中做你想做的事,例如:
@Override public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { // 构建一个Builder来显示网页中的alert对话框 Builder builder = new Builder(TestWebActivity.this); builder.setTitle("alert对话框"); builder.setMessage(message); builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { result.confirm(); } }); builder.setCancelable(false); builder.create(); builder.show(); return true; }
还有诸如onJsConfirm之类的方法同理。
WebView播放视频
WebView要想播放视频,需要注意几点:1、最好设置WebChromeClient。要不然很可能使你的视频框无法加载成功。
2、在Menifest中设置:android:layerType="software"。要不然很可能使你的视频框无法加载成功。
3、在Menifest中设置: <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" />。这两个值一个要足够大,一个要足够小,要不然你的视屏可能只有声音没有
影像,另外全屏时横竖屏切换也需要设置一个合适版本号。我给的是我试过能正常运行的参数,其他的参数能不能行就不晓得了。
4、最好基于Android3.2的sdk开发。
WebView全屏播放需要如下实现WebChromeClient,当点击页面的全屏按钮时会触发onShowCustomView方法,在此方法中捕获视频组件放置到适当的地方去实现你的全屏播放:
private View customView; class SelfWebChromeClient extends WebChromeClient { private Bitmap defaltvideo; private ProgressBar progressbar; private CustomViewCallback myCallback = null; public SelfWebChromeClient( ProgressBar progressbar) { super(); this.progressbar = progressbar; } @Override public void onShowCustomView(View view, CustomViewCallback callback) { if (myCallback != null) { myCallback.onCustomViewHidden(); myCallback = null; return; } setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); ViewGroup parent = (ViewGroup) webView.getParent(); parent.removeView(webView); parent.addView(view); webviewFrame.addView(webView); customView = view; myCallback = callback; } public void onHideCustomView() { if (customView != null) { if (myCallback != null) { myCallback.onCustomViewHidden(); myCallback = null; } try { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); ViewParent pat = customView.getParent(); ViewGroup parent = (ViewGroup) pat; parent.removeView(customView); webviewFrame.removeAllViews(); parent.addView(webView); customView = null; } catch (Exception e) { e.printStackTrace(); } } } // 视频加载添加默认图标 @Override public Bitmap getDefaultVideoPoster() { System.out.println("getDefaultVideoPoster-->>"); if (defaltvideo == null) { defaltvideo = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); } return defaltvideo; } // 视频加载时进程loading @Override public View getVideoLoadingProgressView() { System.out.println("getVideoLoadingProgressView-->>"); ProgressBar progressbar = new ProgressBar(TestWebActivity.this, null, android.R.attr.progressBarStyleHorizontal); progressbar.setLayoutParams(new AbsoluteLayout.LayoutParams( LayoutParams.FILL_PARENT, 3, 0, 0)); return progressbar; } }
回复小屏播放的代码如下:
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (customView != null) { webchromeclient.onHideCustomView(); return true; } else { if (webView.canGoBack()) { webView.goBack(); return true; } else { finish(); } } } return false; }
对于退出后还是有视屏播放的声音的问题,有的人说退出是执行:webView.loadUrl("about:blank")。但是我的测试效果不是很好,建议添加如下代码解决:
@Override protected void onResume() { // LogActs.i("onResume-->>"); try { webView.getClass().getMethod("onResume") .invoke(webView, (Object[]) null); } catch (Exception e) { e.printStackTrace(); } super.onResume(); } @Override protected void onStop() { try { webView.getClass().getMethod("onPause") .invoke(webView, (Object[]) null); } catch (Exception e) { e.printStackTrace(); } // webView.loadUrl("about:blank"); super.onStop(); }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。