此问题与Check if translucent navigation is available类似,但不完全相同。我有一个使用CyanogenMod 11或Android 4.4等效的Nexus 4,任何使用FLAG_TRANSLUCENT_NAVIGATION在横向模式下运行的应用程序都没有像在纵向模式下那样在系统UI上具有半透明效果。
同样的问题可以在Nexus 5上重现,因为我没有在横向模式下使用半透明按钮看到为Android 4.4构建的任何谷歌应用程序。
这是我正在使用的代码
int API_LEVEL = android.os.Build.VERSION.SDK_INT;
if (API_LEVEL >= 19)
{
getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION );
}
当窗口表面变大(并且无法使用)时,没有半透明效果。
所以问题是,我是否必须做任何额外的事情以使其在横向模式下工作?或者这是Android的错误?
答案 0 :(得分:3)
我不知道他们是否打算改变行为,但似乎是故意的。自从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);
}
}
答案 1 :(得分:-1)
您可以使用以下代码查看当前设备上是否有半透明效果:
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_NAVIGATION
和FLAG_TRANSLUCENT_STATUS
标志。然后,您必须说您希望操作栏,通知栏和软按钮栏与您的布局重叠(在setContentView(R.layout.yourlayout);
中onCreate()
之前调用):
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
不要忘记在内容中添加一些填充,以避免它无法访问,因为它们会被这些元素“隐藏”。为实现此目的,您可以在布局中的主容器上添加android:fitsSystemWindows="true"
属性。