How to get screen display metrics in application class
Here, Context.getResource()
DisplayMetrics dm = getResources().getDisplayMetrics();
int densityDpi = dm.densityDpi;
How to get Screen metrics outside an Activity?
The simplest thing would be to pass a Context to the FruitPool constructor. It could then retrieve the display metrics by calling Context.getWindowManager()
. (If you want to run that code outside the constructor, save context.getApplicationContext()
, in case it was passed an Activity context.)
EDIT: If you adopt this approach and are passing an Activity
to the FruitPool
object, and the lifetime of the FruitPool
object might exceed the lifetime of the activity, then you must not keep a reference to the activity. You should instead keep a reference to context.getApplicationContext()
. Since getWindowManager()
is only defined for an Activity
, you can instead use this expression to obtain the WindowManager
:
(WindowManager) context.getSystemService(Context.WINDOW_SERVICE)
How to get Display Metrics in Native Android App
You need to make a JNI call from Java side to native(c++) side and pass your width, height information as parameter to native method.
http://developer.android.com/training/articles/perf-jni.html
Also there is a good and simple example here :
http://www3.ntu.edu.sg/home/ehchua/programming/android/android_ndk.html
display.getRealMetrics() is deprecated
According to the official docs the recommended way is to use WindowManager#getCurrentWindowMetrics()
:
val metrics: WindowMetrics = context.getSystemService(WindowManager::class.java).currentWindowMetrics
If you use it to get screen size, please see my answer here.
I don't know how to get the screen density for use in a class
You need to access resources
through a Context
, as in context.resources.displayMetrics.density
. An Activity
is a Context
, which is why you can just access resources
directly (technically it's this.resources
, where this
is the Activity)
If you're calling that directly within an Activity, it shouldn't be a problem! If it's in another class, you'll have to get a Context
from somewhere - ideally passing one in (e.g. if an Activity is calling a function, it can pass itself as a Context
parameter).
There are a few things that are Context
s, but in this case specifically, you need to be careful:
After
Build.VERSION_CODES#R
, Resources must be obtained byActivity
orContext
created withContext.createWindowContext(int, Bundle)
.Application#getResources()
may report wrong values in multi-window or on secondary displays.
Basically the Context needs to have an idea of how big the app window is, which an Activity
will, but something like applicationContext
might not.
The main reason to be careful is that Activities are big, so you don't want to hold onto them when they're being passed as a Context, because you might keep them in memory after the Activity has been discarded - that would be a memory leak, and it might be what you're getting warned about!
Typically if you did need to hold onto the Context for future use, you'd do something like myContext = passedContext.applicationContext
- so you're not holding on to whatever object was passed in, you're plucking out the shared application context which is always in memory anyway, so it doesn't matter if you keep it. That's a safe way to store one.
But like the docs mentioned above, that's no good here, so ideally your function would:
- use the Activity context to calculate whatever within the function, and use/store that value, discarding the context, or
- access something within the context (
resources
,displayMetrics
etc) and store that if you need to access it later
that way you're storing what you need to, and not holding onto the Activity when you don't need it
Contexts are weird when you're starting out, but they're basically something that provides access to information about the environment the code is running in, and system functions. And some are more specific - like an Activity
is a visible component in your app, so it can provide info like the dimensions of its window, things like that.
So they're really important for Android apps, and you end up passing them around a lot (you'll see them as parameters in a lot of functions), but you also have to be careful of keeping Activity
s in memory by storing references to them in components that outlive the Activity itself. Hope that makes some sense!
Get screen width and height in Android
Using this code, you can get the runtime display's width & height:
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;
In a view you need to do something like this:
((Activity) getContext()).getWindowManager()
.getDefaultDisplay()
.getMetrics(displayMetrics);
In some scenarios, where devices have a navigation bar, you have to check at runtime:
public boolean showNavigationBar(Resources resources)
{
int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
return id > 0 && resources.getBoolean(id);
}
If the device has a navigation bar, then count its height:
private int getNavigationBarHeight() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int usableHeight = metrics.heightPixels;
getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
int realHeight = metrics.heightPixels;
if (realHeight > usableHeight)
return realHeight - usableHeight;
else
return 0;
}
return 0;
}
So the final height of the device is:
int height = displayMetrics.heightPixels + getNavigationBarHeight();
Getting screen size not from Activity subclass
Yes there is a way, if you can pass the Context Object to your non activity class,
int width= context.getResources().getDisplayMetrics().widthPixels;
int height= context.getResources().getDisplayMetrics().heightPixels;
You don't need the Activity Object itself.
How to get screen dimensions as pixels in Android
If you want the display dimensions in pixels you can use getSize
:
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
If you're not in an Activity
you can get the default Display
via WINDOW_SERVICE
:
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
If you are in a fragment and want to acomplish this just use Activity.WindowManager (in Xamarin.Android) or getActivity().getWindowManager() (in java).
Before getSize
was introduced (in API level 13), you could use the getWidth
and getHeight
methods that are now deprecated:
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth(); // deprecated
int height = display.getHeight(); // deprecated
For the use case, you're describing, however, a margin/padding in the layout seems more appropriate.
Another way is: DisplayMetrics
A structure describing general information about a display, such as its size, density, and font scaling. To access the DisplayMetrics members, initialize an object like this:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
We can use widthPixels
to get information for:
"The absolute width of the display in pixels."
Example:
Log.d("ApplicationTagName", "Display width in px is " + metrics.widthPixels);
API level 30 update
final WindowMetrics metrics = windowManager.getCurrentWindowMetrics();
// Gets all excluding insets
final WindowInsets windowInsets = metrics.getWindowInsets();
Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars()
| WindowInsets.Type.displayCutout());
int insetsWidth = insets.right + insets.left;
int insetsHeight = insets.top + insets.bottom;
// Legacy size that Display#getSize reports
final Rect bounds = metrics.getBounds();
final Size legacySize = new Size(bounds.width() - insetsWidth,
bounds.height() - insetsHeight);
Related Topics
How to Solve Render Problem Path.Op() Not Supported
How to Make a Dialog Slide from Bottom to Middle of Screen in Android
How to Make My Layout Able to Scroll Down
Is There a Faster Way to Decode HTML Characters to a String Than HTML.Fromhtml()
Firebase Retrieve Data Null Outside Method
Android Input Connection Error
Android Add Image to Webview from a Drawable
Android Webview Cannot Render Youtube Video Embedded via Iframe
Trying to Fix Networkonmainthreadexception But Gives Toast Error
Push Notification Enable and Disable by Using Switch
Clicking on Notification Is Not Starting Intended Activity
Attempt to Reopen an Already-Closed Object SQLitedatabase
Mediaplayer Stop Playing After About 5 Seconds
How to Have a Masked Numeric Input Field
How to Save Image Taken from Camera and Show It to Listview - Crashes with "Illegalstateexception"