如何获取屏幕宽度和高度

55

我尝试使用以下代码来获取Android应用程序开发中的屏幕宽度和高度:

Display display = getWindowManager().getDefaultDisplay(); 
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();

但我在我的display上遇到了NullPointerException,为什么?怎样获取屏幕的宽度和高度呢?


1
你把这三行代码放在哪里?也许默认的显示器在你的代码执行时还没有准备好。请发布代码上下文。尝试在Activity的onCreate()中调用它。 - Kevin Yuan
1
你是在一个帮助类中尝试做这个,而不是在一个Activity中吗? - Howler
2
如果其中一个解决了您的问题,您应该接受一个答案。 - areyling
2
如果其中一个答案被标记为正确的话,那就太好了。 - Allen Edwards
不要使用getWindowManager().getDefaultDisplay(),因为你无法保证它是否是当前的显示器。 - EpicPandaForce
14个回答

133

如果你在Activity之外调用此方法,则需要传入上下文(或通过其他调用获取它)。然后使用该上下文来获取显示指标:

DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;

更新:从 API 级别 17+ 开始,您可以使用 getRealSize

Point displaySize = new Point();
activity.getWindowManager().getDefaultDisplay().getRealSize(displaySize);

如果你想获取可用的窗口大小,你可以使用getDecorView计算出可用区域,通过减去装饰视图的大小与实际显示大小:

Point displaySize = new Point();
activity.getWindowManager().getDefaultDisplay().getRealSize(displaySize);

Rect windowSize = new Rect();
ctivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(windowSize);

int width = displaySize.x - Math.abs(windowSize.width());
int height = displaySize.y - Math.abs(windowSize.height());
return new Point(width, height);

getRealMetrics 也可能可行(需要API级别17+),但我还没有尝试过:

DisplayMetrics metrics = new DisplayMetrics();
activity.GetWindowManager().getDefaultDisplay().getRealMetrics(metrics);

1
好的回答。请添加可以在没有上下文的情况下使用getResources()的可能性。 - Kostanos
1
由于getResources()Context类上的一个抽象方法,因此您无法在没有上下文的情况下使用它。如果您在活动中,只需调用“getResources()”即可;如果您在视图中,则可以使用“getContext()。getResources()”。如果这些都不适用于您,并且您不想传递上下文,请参见此StackOverflow问题以获取备选解决方案。希望能对您有所帮助! - areyling
1
这就是答案,不确定为什么@Leem不接受这个答案或者至少其中一个答案。 - SARose
“height” 似乎比可见屏幕高,如何获取屏幕的实际高度。 - zionpi
@zionpi,查看更新的内容获取可用区域的另一种方法。 - areyling
显示剩余4条评论

41

在一个活动中,您可以调用:

int width = this.getResources().getDisplayMetrics().widthPixels;
int height = this.getResources().getDisplayMetrics().heightPixels;

当您在视图中时,首先需要获取上下文:

int width = getContext().getResources().getDisplayMetrics().widthPixels;
int height = getContext().getResources().getDisplayMetrics().heightPixels;

这将在所有 Android 版本中工作,可用自 API 1 起,且从未被弃用。


getApplicationContext() 用于从 Fragment 中获取上下文,而不是从 View 中获取。从 View 中获取应该使用 getContext()。 - Oliver Hausler
@OliverHausler getContext也可以使用,但仅适用于视图中。getApplicationContext在视图和片段中都可以使用,在活动中也可以使用。它基本上为您提供了整个应用程序的上下文,更重要的是在调用资源以获取像素大小之前首先获取上下文。如果您有任何强烈的反对理由,请提供。 - Khulja Sim Sim
我没有对任何东西进行负面评价,我只是评论了你所说的是不正确的,而且确实如此。"当你在一个视图中时,你需要先获取上下文" -> int width = getApplicationContext().getResources().getDisplayMetrics().widthPixels; 无法在视图内部工作。 - Oliver Hausler
应该这样做,它也确实如此。像其他点赞者一样正确地尝试。 - Khulja Sim Sim
1
请查看参考文献http://developer.android.com/reference/android/view/View.html#getContext()并尝试使用它。视图中没有getApplicationContext()方法。 - Oliver Hausler

19

来自服务:

Display  display= ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int width = display.getWidth(); 
int height = display.getHeight(); 

15

这是最终对我起作用的代码:

DisplayMetrics metrics = this.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;

13

如果您有一个上下文可用,可以通过context.getResources().getDisplayMetrics()来尝试获取。


你能更具体地说明吗?我的意思是接下来是什么? - Leem
1
http://developer.android.com/reference/android/content/Context.html#getResources(),因此通常是一个活动。 - MrJre
@Leem 接下来你可以将它放入一个变量中,然后直接从变量中获取 widthPixels(宽度)和 heightPixels(高度)。 - android developer

7
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

int height = metrics.heightPixels;
int width = metrics.widthPixels;

我猜你写的代码已经过时了。

4
if (Build.VERSION.SDK_INT >= 11) {
        Point size = new Point();
        try {
            this.getWindowManager().getDefaultDisplay().getRealSize(size);
            screenWidth = size.x;
            screenHeight = size.y;
        } catch (NoSuchMethodError e) {
             screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
             screenWidth=this.getWindowManager().getDefaultDisplay().getWidth();
        }

    } else {
        DisplayMetrics metrics = new DisplayMetrics();
        this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        screenWidth = metrics.widthPixels;
        screenHeight = metrics.heightPixels;
    }

但是代码有一点问题:getRealSize是在API 17中添加的。 - user1991679

3
尝试使用以下代码获取屏幕的宽度和高度。
int widthOfscreen =0;
int heightOfScreen = 0;
DisplayMetrics dm = new DisplayMetrics();
        try {
            ((Activity) context).getWindowManager().getDefaultDisplay()
                    .getMetrics(dm);
        } catch (Exception ex) {
        }
         widthOfscreen  = dm.widthPixels;
heightOfScreen  = dm.heightPixels;

2
WindowManager w = getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);

Log.d("WIDTH: ", String.valueOf(d.getWidth()));
Log.d("HEIGHT: ", String.valueOf(d.getHeight()));

2
       /*
        *DisplayMetrics: A structure describing general information about a display, such as its size, density, and font scaling.
        * */

 DisplayMetrics metrics = getResources().getDisplayMetrics();

       int DeviceTotalWidth = metrics.widthPixels;
       int DeviceTotalHeight = metrics.heightPixels;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接