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" android:hardwareAccelerated="true"。要不然很可能使你的视频框无法加载成功。
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();
}