繁体   English   中英

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

[英]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();

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

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

------------正常(ok)

正常模式

-----带视频控件的全屏(不行)--------不带视频控件的全屏(可以) 在此处输入图片说明 在此处输入图片说明

代码:

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();
}

}

如何解决?

ps 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 (它会工作车)并调用FullscreenOnonShowCustomViewFullscreenOffonHideCustomView 这样做会很好,但仍然没有完全隐藏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。 只有一个主题就完成了!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM