从WebView打开全屏视频后关闭,出现白屏问题

4

我有一个带有嵌入式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(),但是整个活动都会结束。如何摆脱那个白色窗帘?
1个回答

2

我研究了一些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();
    }
}

连接问题-已解决: 事实证明,当重新打开Activity并再次播放视频或调用webView.onPause()时,有时会在HTML5VideoView.reprepareData崩溃,这似乎是另一个问题...

最终说明

为了使WebView正常工作且不泄漏内存,您应按照以下方式在Activity或Fragment生命周期回调中调用相应的WebViewMethods,如下所示:

Activity(可能与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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接