我正在尝试实现全屏模式,但对于Android 4.4及更高版本,它会在那里显示一个空白区域:
在沉浸式模式之前(全屏)
和AFTER的toggleFullScreen
(假);
如你所见,它不会删除它.这是我用来切换它的代码:
public void toggleFullscreen(boolean fs) {
if (Build.VERSION.SDK_INT >= 11) {
// The UI options currently enabled are represented by a bitfield.
// getSystemUiVisibility() gives us that bitfield.
int uiOptions = this.getWindow().getDecorView().getSystemUiVisibility();
int newUiOptions = uiOptions;
boolean isImmersiveModeEnabled =
((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
if (isImmersiveModeEnabled) {
Log.i(getPackageName(), "Turning immersive mode mode off. ");
} else {
Log.i(getPackageName(), "Turning immersive mode mode on.");
}
// Navigation bar …
Run Code Online (Sandbox Code Playgroud) 最初我使用以下代码将我的Activity设置为沉浸模式:
View decorView = getWindow().getDecorView();
decorView.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_STICKY);
Run Code Online (Sandbox Code Playgroud)
一切正常,直到用户点击EditText并出现软键盘.它会导致状态栏粘在顶部,即使在软键盘消失后也不会再次隐藏.奇怪的是,我只在LG /三星手机上遇到过这个问题,索尼手机对此没有任何问题.有人对此有任何想法吗?
android android-softkeyboard android-edittext android-statusbar android-immersive
我有一个使用Fragments制作的Android应用程序
我使用以下代码隐藏屏幕顶部和底部的条形图.
@Override
protected void onResume() {
super.onResume();
isInBackground = false;
if(null == getFragmentManager().findFragmentById(R.id.content_container))
{
getFragmentManager().beginTransaction().add(R.id.content_container,new PresenterFragment(), PresenterFragment.FRAG_TAG).commit();
}
if(Build.VERSION.SDK_INT >=19)
{
View decorView = getWindow().getDecorView();
int uiOptions = 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 // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(uiOptions);
decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
View decorView = getWindow().getDecorView();
int uiOptions = 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 // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide …
Run Code Online (Sandbox Code Playgroud) 我有一个全屏活动,它使用以下两个功能隐藏/显示系统UI:
// This snippet hides the system bars.
public static void hideSystemUI(View view) {
// Set the IMMERSIVE flag.
// Set the content to appear under the system bars so that the content
// doesn't resize when the system bars hide and show.
view.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 // hide nav bar
| View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
// This snippet shows the system bars. It does this by removing all the flags
// …
Run Code Online (Sandbox Code Playgroud) 我在使用沉浸式模式时遇到了问题.以下是我对所有活动的代码:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
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_STICKY
);
}
}
Run Code Online (Sandbox Code Playgroud)
该navigationBar
和statusBar
是不可见的,这是件好事.
问题是,每次我去另一个活动,navigationBar
出现,然后消失.我希望那navigationBar
不是那样的.
当在Android应用程序中使用弹出窗口时,沉浸式粘滞模式似乎不起作用.在弹出窗口期间,状态和导航栏会成为焦点.虽然我能够重置警报对话框的系统UI标志以避免此行为,但我不知道如何为弹出窗口执行此操作.有人可以帮忙吗?
以下是我创建弹出窗口的方法:
LayoutInflater layoutInflater = (LayoutInflater) getActivity().getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View popUpView = layoutInflater.inflate(R.layout.popup_image_selector, null);
DisplayMetrics displayMetrics = getActivity().getApplicationContext().getResources().getDisplayMetrics();
int width = displayMetrics.widthPixels;
int height = displayMetrics.heightPixels;
final PopupWindow popUp = new PopupWindow(popUpView,(int) (width*0.66), (int)(height*.20));
popUp.setFocusable(true);
popUp.setOutsideTouchable(true);
popUp.setContentView(popUpView);
popUp.showAtLocation(imageContent, Gravity.BOTTOM, 0, (int)(height*.20));
Run Code Online (Sandbox Code Playgroud)
我在哪里可以设置系统UI标志,因为我不能够访问getWindow().setFlags或getWindow().getDecorView的弹出窗口.
感谢任何帮助!
谢谢!
试图用身临其境的方式,使用时碰到的问题android:fitsSystemWindows="true"
用DrawerLayout
.我必须将此设置为true,以便将DrawerLayout
工具栏约束到系统栏.
问题是,我有一个Fragment
将应用程序设置为沉浸式模式.这使得应用程序执行此操作:
我所知道的是一个已知的问题android:fitsSystemWindows="true"
.我将其设置为false
,沉浸式模式运行良好,但工具栏和布局的其余部分不再受制于系统栏.我尝试在运行时设置值,布局的下半部分(也就是导航栏区域)由我的布局填充,但系统栏区域仍然显示:
这是我的代码:
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
ClockFragment.java - 隐藏和显示
private void hideSystemUI() {
if (Build.VERSION.SDK_INT >= 14) {
getActivity().findViewById(R.id.drawer_layout).setFitsSystemWindows(false);
}
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
if (Build.VERSION.SDK_INT >= 19) {
mDecorView.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);
} else if (Build.VERSION.SDK_INT >= …
Run Code Online (Sandbox Code Playgroud) android android-windowmanager navigation-drawer android-immersive
我使用沉浸式粘性模式来隐藏导航栏和操作栏:
@TargetApi(19)
private void setImmersiveMode() {
if (Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
int uiOptions = getImmersiveUiOptions(decorView);
decorView.setSystemUiVisibility(uiOptions);
ActionBar actionBar = getActionBar();
if (null!=actionBar) {
actionBar.hide();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当Spinner
被触摸时,navigationBar
被示出和沉浸式模式是禁用的。
此解决方案适用于对话框:
dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
dialog.show();
dialog.getWindow().getDecorView().setSystemUiVisibility(
context.getWindow().getDecorView().getSystemUiVisibility());
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
Run Code Online (Sandbox Code Playgroud)
但是Spinner
没有show()
我可以覆盖的方法。
触摸微调器时如何防止系统 UI 显示?
编辑:这个问题是关于保持导航栏隐藏(BackButton、HomeButton 和RecentTasksButton)。我已经在用FLAG_FULLSCREEN
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
Run Code Online (Sandbox Code Playgroud) 我在我的应用上有一个videoview,我使用gogole作为参考来使视频播放器全屏显示:
https://developer.android.com/training/system-ui/immersive#java
我从上面的网站关注了instruccion,并且能够将视频播放器全屏显示,但是我的媒体控制器和设备控制器出现了一个奇怪的问题(它们过大),并且不知道如何解决任何想法。问题。
public class VideoPlayer extends AppCompatActivity {
VideoView videoView;
MediaController mediaController;
private String TAG = VideoPlayer.class.getSimpleName();
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.video_player_activity);
videoView = (VideoView) findViewById(R.id.videoView);
mediaController = new MediaController(this);
videoView.setVideoPath("android.resource://" + getPackageName() + "/" + R.raw.video1);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);
videoView.start();
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
hideSystemUI();
}
}
private void hideSystemUI() {
View decorView = getWindow().getDecorView();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
decorView.setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN …
Run Code Online (Sandbox Code Playgroud) 我按照Android 开发教程操作并获得了全屏粘性沉浸模式。这使得状态栏和导航栏隐藏,直到用户从底部向上或从顶部向下滑动,此时它们会出现并在不使用时慢慢淡出。
问题出在 Android 10(可能还有其他版本)上:屏幕底部的导航栏只是白色图标。没有透明的黑色背景。这使得使用浅色用户界面很难看清。
有没有办法改变导航栏的背景或图标颜色?特别是粘性的沉浸式导航栏,它会出现并消失(因为它太轻,无法与浅色 UI 一起使用)。
我尝试过以编程方式设置样式和颜色,但它们仅在非全屏模式下工作:
<!-- does not work -->
<item name="android:navigationBarColor">@android:color/white</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowLightNavigationBar">true</item>
Run Code Online (Sandbox Code Playgroud)
我也尝试过聆听,OnSystemUiVisibilityChangeListener
这样我就可以在导航栏后面显示我自己的透明栏,但它不会触发粘性沉浸模式(如本 SO 帖子和视频中所述):
https://www.youtube.com/watch?v=cBi8fjv90E4&feature=youtu.be&t=6m56s
设置全屏的活动代码(kotlin):
protected fun isFullscreen() = defaultSharedPref.getBoolean(SharedPreferenceKey.IS_FULL_SCREEN, false)
private fun supportsFullscreenMode(): Boolean {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (hasFocus && isFullscreen()) toggleFullScreenMode(true)
}
/**
* "sticky immersive" full screen mode.
* When user swipes from top/bottom edge, transparent status bar and navigation bar appear and …
Run Code Online (Sandbox Code Playgroud)