This issue is similar to Check if translucent navigation is available but not quite it. I have a Nexus 4 flashed with CyanogenMod 11 or Android 4.4 equivalent and any app running in landscape mode with FLAG_TRANSLUCENT_NAVIGATION does not feature the translucency on the system UI like in portrait mode.
The same issue can be reproduced on Nexus 5 as I have not seen any google app built for Android 4.4 in Landscape mode with translucent buttons.
This is the code that I'm using
int API_LEVEL = android.os.Build.VERSION.SDK_INT;
if (API_LEVEL >= 19)
{
getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION );
}
And while the window surface gets larger (and unusable) there is no translucency.
So the question is, do I have to do anything extra to make it work in landscape mode ? or is this an Android bug ?
I don't know if they intend to change the behavior, but it seems deliberate. Ever since FLAG_TRANSLUCENT_NAVIGATION
was introduced in Android Kitkat, "phone"-sized devices have always had an opaque black navigation bar on the right side of the screen in landscape. Even at the time of this post, there is a new flag in Android Lollipop (FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
) which has the same behavior, no matter what was passed to setStatusBarColor())
.
Here is some rough code you could use to know when the navigation bar style is out of your control.
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);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With