当显示全屏视频播放器的控件(可见)时,状态栏返回(可见)
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。只要一个主题就完成了!!
我使用 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。只要一个主题就完成了!!