FLAG_TRANSLUCENT_NAVIGATION在横向模式下不可用?

这个问题类似于检查半透明导航是否可用,但不是。 我有一个与CyanogenMod 11或Android 4.4等效闪光灯的Nexus 4和任何横向模式下运行的应用程序与FLAG_TRANSLUCENT_NAVIGATION不具有像纵向模式的系统UI上的半透明。

同样的问题可以在Nexus 5上复制,因为我还没有看到有横向button的横向模式下为Android 4.4构build的任何谷歌应用程序。

这是我正在使用的代码

int API_LEVEL = android.os.Build.VERSION.SDK_INT; if (API_LEVEL >= 19) { getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION ); } 

而当窗户表面变得更大(并且不能使用)时,没有半透明。

所以问题是,我必须做额外的事情才能在横向模式下工作吗? 或者这是一个Android的错误?

我不知道他们是否打算改变这种行为,但似乎是故意的。 自从在Android Kitkat中引入FLAG_TRANSLUCENT_NAVIGATION以来,“手机”大小的设备在横向屏幕右侧总是有一个不透明的黑色导航栏。 即使在这篇文章的时候,Android Lollipop( FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS )中也有一个新的标志,无论传递给setStatusBarColor() )是什么,它都有相同的行为。

以下是一些粗略的代码,可以用来了解导航栏风格何时不在您的控制之下。

 class MyActivity extends Activity { // ... boolean isNavigationForcedBlack() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return true; } final int windowFlags = getWindow().getAttributes().flags; int navControlFlags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { navControlFlags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; } if ((windowFlags & navControlFlags) == 0) { return true; } boolean deviceHasOpaqueSideLandscapeNav = getDeviceSmallestWidthDp() < 600; boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; return deviceHasOpaqueSideLandscapeNav && isLandscape; } DisplayMetrics dm = new DisplayMetrics(); float getDeviceSmallestWidthDp() { getWindowManager().getDefaultDisplay().getRealMetrics(dm); float widthDp = dm.widthPixels / dm.density; float heightDp = dm.heightPixels / dm.density; return Math.min(widthDp, heightDp); } } 

您可以使用以下代码查看当前设备是否可以使用半透明效果:

 int id = getResources().getIdentifier("config_enableTranslucentDecor", "bool", "android"); if (id != 0 && getResources().getBoolean(id)) { // Translucent available Window w = getWindow(); w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } 

使用此代码,您可以检查设备是否可以使用FLAG_TRANSLUCENT_NAVIGATIONFLAG_TRANSLUCENT_STATUS标志。 然后,你必须说你想要Actionbar,通知栏和软button栏重叠你的布局(要在setContentView(R.layout.yourlayout);之前调用setContentView(R.layout.yourlayout);onCreate() ):

 getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); 

不要忘记添加一些填充内容,以避免它无法访问,因为它将被这些元素“隐藏”。 为了实现这一点,你可以在你的布局的主容器中添加android:fitsSystemWindows="true"属性。