since android 3.0 there is a navigation bar with back and home button on the display. Now if I get the screen size like this
ClockLwp.ScreenHeight = getWindowManager().getDefaultDisplay().getHeight();
ClockLwp.ScreenWidth = getWindowManager().getDefaultDisplay().getWidth();
of this
getResources().getDisplayMetrics().widthPixels
getResources().getDisplayMetrics().heightPixels
I get different values for the landscape and portrait. Here is an example what I mean:
Acer Iconia A500 portrait mode : 800 x 1232 Acer Iconia A500 landscape mode : 1280 x 752
AFAIK this goes for all devices with such a navigation bar. (e.g. Samsung Galaxy Nexus, GalaxyTab 10.1 etc.)
Now my question is, if I am in portrait mode how can I get the values of landscape mode and the other way around?
The best way to create a responsive layout is to use ConstraintLayout as the base layout in your UI. ConstraintLayout enables you to specify the position and size of each view according to spatial relationships with other views in the layout. All the views can then move and resize together as the screen size changes.
int orientation = display. getOrientation(); Check orientation as your way and use this to change orientation: setRequestedOrientation (ActivityInfo.
The answer is that you cannot globally set orientation. Any app can choose to handle orientation itself, and if it does so then it can choose to ignore changes to the device's orientation, or to change orientation based on its own criteria.
since android 3 there is no way with the public api to retrive the raw heigth and width . You can go through reflection. Look for getRawHeigth/Width
EDIT (26 September 2014): I reformulated my text to contain a full answer and not just comment to Dmitri solution.
Here is the part that we are using to calculate the navigation bar height before rotation:
DisplayMetrics metrics = new DisplayMetrics();
mFragment.getActivity().getWindowManager().getDefaultDisplay()
.getMetrics(metrics);
/*
* We need to take system resources here to verify navigation
* bar height. Application resources also contains navigation bar
* height but this value is not valid for some devices e.g. Nexus 7 (2012)!
*/
Resources appRes = getResources();
Resources sysRes = Resources.getSystem();
boolean landscapeMode = (metrics.widthPixels > metrics.heightPixels);
/* Check if the device has navigation bar. There is no direct API for
* that so we use some hacking that may not always work,
* (see http://stackoverflow.com/questions/16092431/check-for-navigation-bar)
* but this method should be enough for most devices.
* TODO: Find a more consistent way. For our needs it is currently enough as we
* support limited set of devices.
*/
boolean hasNavigationBar = !ViewConfiguration.get(getContext()).hasPermanentMenuKey();
int navBarHeight = 0;
int navBarHeightRotated = 0;
if (hasNavigationBar) {
int barHeightDimId = 0;
int barHeightDimIdRotated = 0;
if (landscapeMode) {
barHeightDimId = sysRes.getIdentifier(
"navigation_bar_height_landscape", "dimen", "android");
barHeightDimIdRotated = sysRes.getIdentifier(
"navigation_bar_height", "dimen", "android");
} else {
barHeightDimIdRotated = sysRes.getIdentifier(
"navigation_bar_height_landscape", "dimen", "android");
barHeightDimId = sysRes.getIdentifier("navigation_bar_height",
"dimen", "android");
}
if (barHeightDimId != 0) {
navBarHeight = appRes.getDimensionPixelSize(barHeightDimId);
}
if (barHeightDimIdRotated != 0) {
navBarHeightRotated = appRes
.getDimensionPixelSize(barHeightDimIdRotated);
}
NCLogs.i("MyApp", String.format("Android navigation bar height: %d (current), %d (after rotation)", navBarHeight, navBarHeightRotated));
}
then we can calculate our view width and height after rotation:
int realScreenHeight = metrics.heightPixels + navBarHeight;
// We expect to not have decor views near the left or right borders
int realScreenWidth = metrics.widthPixels;
/*
* Height of decor views: system status bar + any application addtional elements +
* + system navigation bar
*/
int decorHeightRotated = realScreenHeight - getHeight() - navBarHeight + navBarHeightRotated;
int viewWidthRotated = realScreenHeight;
int viewHeightRotated = (realScreenWidth - decorHeightRotated);
NCLogs.i("MyApp", String.format("Width after rotation: %d, Height after rotation: %d", viewWidthRotated, viewHeightRotated));
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