我有一个带有嵌入式youtube视频的WebView
。我已经使用简单的对话框解决方案实现了全屏模式,如下所示:
webView.setWebChromeClient(new CustomWebChromeClient());
public class CustomWebChromeClient extends WebChromeClient {
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
Dialog dialog = new Dialog(ArticleDetailsActivity.this, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
view.setBackgroundColor(getResources().getColor(R.color.black));
dialog.setContentView(view);
dialog.show();
}
@Override
public void onHideCustomView() {
super.onHideCustomView();
}
}
它工作得很好,除了使用后退按钮关闭视频的那一刻,因为然后全屏视频消失,白色全屏覆盖物留在屏幕上,直到使用另一个后退按钮。我试着聪明一点,在onHideCustomView()
中做了onBackPressed()
,但后来整个活动都结束了。
如何摆脱那白色的窗帘?
深入研究了android代码,找到了解决方案:
public class CustomWebChromeClient extends WebChromeClient {
@Override
public void onShowCustomView(View view, final CustomViewCallback callback) {
Dialog dialog = new Dialog(ArticleDetailsActivity.this, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
view.setBackgroundColor(getResources().getColor(R.color.black));
dialog.setContentView(view);
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
callback.onCustomViewHidden();
chromeWebClient.onHideCustomView();
}
});
dialog.show();
}
@Override
public void onHideCustomView() {
super.onHideCustomView();
}
}
关联问题-已解决:事实证明,这有时会在重新打开活动并再次播放视频时与HTML5VideoView.reprepareData
崩溃,或者在调用webView.onPause()
时与HTML5VideoView.isPlaying
崩溃,这似乎是另一个问题。。。
最终注释
为了使WebView工作良好且不泄漏内存,您应该在Activity
或Fragment
生命周期回调中为Activity
调用相应的WebViewMethods
(可能与Fragment
类似):
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState == null) {
webView.restoreState(savedInstanceState);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(BundleKeys.HAS_PHOTOS, hasPhotos);
outState.putLong(BundleKeys.ARTICLE_ID, articleId);
webView.saveState(outState);
}
@Override
protected void onResume() {
webView.onResume();
}
@Override
protected void onPause() {
super.onPause();
webView.onPause();
}
@Override
protected void onStop() {
super.onStop();
webView.stopLoading();
}
@Override
protected void onDestroy() {
super.onDestroy();
webView.destroy();
}