关闭从WebView打开的全屏视频后出现白色屏幕



我有一个带有嵌入式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工作良好且不泄漏内存,您应该在ActivityFragment生命周期回调中为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();
}

最新更新