当显示全屏视频播放器的控件(可见)时,状态栏返回(可见)

Status bar is back (visible) when controls of videoplayer in fullscreen are shown (visible)

我使用 WebView 加载视频。我覆盖了 onShowCustomView(进入全屏)和 onHideCustomView(退出全屏)方法。 当我进入全屏模式时,变量 fullscreen 设置为 true 并且 OnSystemUiVisibilityChangeListener 调用 GoFullscreen() 设置 SYSTEM_UI_FLAG_FULLSCREEN 标志并隐藏操作栏的函数:

decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); getSupportActionBar().hide();

但是当我进入全屏模式时,如果视频控件可见,状态栏是可见的。因此只有在视频控件消失(不可见)时状态栏才会隐藏。

显示视频和状态栏控件问题的屏幕截图:

------------正常(好)

-----带视频控件的全屏(不行)-------- 不带视频控件的全屏 (行)

代码:

public class TestActivity extends AppCompatActivity {
private MyWebChromeClient mWebChromeClient = null;
private View mCustomView;
private LinearLayout mContentView;
private FrameLayout mCustomViewContainer;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
private Bundle webViewBundle;
private WebView mWebView;
private int viewWidth;
private int viewHeight;
private LinearLayout.LayoutParams layoutParams;
private View decorView;
private Boolean Fullscreen = false;

private void GoFullscreen() {
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
    getSupportActionBar().hide();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    decorView = getWindow().getDecorView();
    decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
        @Override
        public void onSystemUiVisibilityChange(int visibility) {
            if (Fullscreen) {
                GoFullscreen();
            } else {
                decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
                getSupportActionBar().show();
            }
        }
    });

    mWebView = (WebView) findViewById(R.id.webView);
    mWebView.setBackgroundColor(Color.BLACK);
    mWebChromeClient = new MyWebChromeClient();
    mWebView.setWebChromeClient(mWebChromeClient);
    mWebView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });
    WebSettings webSettings = mWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);

    viewWidth = 480;
    viewHeight = (int) (((double) viewWidth) * 0.5625); // video aspect 16:9
    layoutParams = new LinearLayout.LayoutParams(viewWidth, viewHeight);
    mWebView.setLayoutParams(layoutParams);

    if (webViewBundle != null) {
        mWebView.restoreState(webViewBundle);
    } else {
        mWebView.loadUrl("http://vk.com/video_ext.php?oid=-89326201&id=171643607&hash=2b18b090e13222dc&hd=1");
    }
}

@Override
public void onPause() {
    super.onPause();
    webViewBundle = new Bundle();
    mWebView.saveState(webViewBundle);
    mWebView.onPause();
}

@Override
public void onResume() {
    super.onResume();
    mWebView.onResume();
}

@Override
public void onDestroy() {
    super.onDestroy();
    mWebView.destroy();
}

public class MyWebChromeClient extends WebChromeClient {
    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) {
        // if a view already exists then immediately terminate the new one
        if (mCustomView != null) {
            callback.onCustomViewHidden();
            return;
        }
        Fullscreen = true;
        FrameLayout.LayoutParams LayoutParameters = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
        mContentView = (LinearLayout) findViewById(R.id.activity_main);
        mCustomViewContainer = new FrameLayout(TestActivity.this);
        mCustomViewContainer.setLayoutParams(LayoutParameters);
        mCustomViewContainer.setBackgroundResource(android.R.color.black);
        view.setLayoutParams(LayoutParameters);
        mCustomViewContainer.addView(view);
        mCustomView = view;
        mCustomViewCallback = callback;
        mContentView.setVisibility(View.GONE);
        GoFullscreen();
        mCustomViewContainer.setVisibility(View.VISIBLE);
        setContentView(mCustomViewContainer);
    }

    @Override
    public void onHideCustomView() {
        if (mCustomView != null) {
            // Hide the custom view.
            mCustomView.setVisibility(View.GONE);
            // Remove the custom view from its container.
            mCustomViewContainer.removeView(mCustomView);
            mCustomView = null;
            mCustomViewContainer.setVisibility(View.GONE);
            mCustomViewContainer = null;
            mCustomViewCallback.onCustomViewHidden();
            // Show the content view.
            Fullscreen = false;
            mContentView.setVisibility(View.VISIBLE);
            setContentView(mContentView);
        }
    }
}

@Override
public void onBackPressed() {
    if (mCustomViewContainer != null)
        mWebChromeClient.onHideCustomView();
    else if (mWebView.canGoBack())
        mWebView.goBack();
    else
        super.onBackPressed();
}

}

如何解决?

p.s。 build.gradle API: compileSdkVersion 23 / buildToolsVersion "23.0.1" / minSdkVersion 19 / targetSdkVersion 23

更新: 似乎只在 KitKat 上有问题。我在 API 23 智能手机上测试过,没有这个问题。仍然需要为 KitKat 设备修复它

你所有的东西还是一样的,只是改变 FullScreen 方法如下

public class MainActivity extends Activity {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);


        }

        private void GoFullscreen() {
            getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN
                            | View.SYSTEM_UI_FLAG_IMMERSIVE);
        }

    }

最终我决定我不应该使用 OnSystemUiVisibilityChangeListener(它会导致错误),而只是在 onShowCustomView 中调用 FullscreenOn 并在 onHideCustomView 中调用 FullscreenOff .这会很好用,但仍然没有完全隐藏 KitKat 的侧边栏(但适用于 Android 的其他版本)

    private void FullscreenOn() {
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
        getSupportActionBar().hide();
    }

    private void FullscreenOff() {
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
        getSupportActionBar().show();
    }

1.将此主题添加到您的 styles.xml

<style name="NoStatusBarTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

2。在AndroidManifest.xml

中添加以上主题
<activity
        android:name=".ui.XYZActivity"
        android:theme="@style/NoStatusBarTheme" />

没有弃用的代码。没有任何特定 Android 版本的 if-else。只要一个主题就完成了!!