50

我试着用下面的代码获取屏幕宽度和高度的Android应用开发:如何获取屏幕宽度和高度

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

,但我得到NullPointerException异常display,为什么呢?如何获得屏幕宽度和高度呢?

+1

你在哪里放置这些3线?当你执行代码时,默认的显示器可能还没有准备好。请发布代码上下文。尝试在你的Activity的onCreate()中调用它。 –

+1

你是否试图在助手类中做到这一点,这不是一个活动? – Howler

+2

如果其中一个问题解决了您的问题,您应该接受答案。 – areyling

回答

11

如果您有上下文可用,请尝试通过context.getResources().getDisplayMetrics()

+0

你可以请更具体的?我的意思是接下来呢? – Leem

+1

http://developer.android.com/reference/android/content/Context.html#getResources(),所以通常是一个活动。 – MrJre

+0

@Leem接下来你把它放在一个变量中,你可以直接从变量中获得widthPixels(对于宽度)和heightPixels(对于高度)。 –

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; 
19

的高度从服务:

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

非常感谢! – XXX

+0

查看演示代码,下载并运行你的android工作室http://whats-online.info/science-and-tutorials/121/android-get-screen-width-and-height-programmatically/ –

123

如果你调用此活动的外,你还需要通过上下文(或通过其他呼叫获取)。然后用它来让你的显示器的指标:

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

UPDATE:随着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

@Kostanos As [getResources()](http://developer.android.com/reference/android/content/Context.html#getResources())是Context类的抽象方法,您不能使用它没有上下文。如果你在一个Activity中,你可以调用'getResources()';如果你在视图中,你可以使用'getContext()。getResources()'。如果这两个都不适合你,并且你不想传递一个Context,请参阅[这个StackOverflow问题](http://stackoverflow.com/questions/16277011/getresources-from-static-method-without-context)为替代解决方案。希望有所帮助! – areyling

+0

你是对的,它适用于AndEngine Activities类,但可能不适用于SDK的默认Activity类。谢谢。 – Kostanos

3
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())); 
8
DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 

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

我猜你写的是过时的代码。

16

这是最终为我工作:

DisplayMetrics metrics = this.getResources().getDisplayMetrics(); 
int width = metrics.widthPixels; 
int height = metrics.heightPixels; 
0
Display display = getActivity().getWindowManager().getDefaultDisplay(); 
int screenWidth = display.getWidth(); 
int screenHeight = display.getHeight(); 
Log.d("Tag", "Getting Width >> " + screenWidth); 
Log.d("Tag", "Getting Height >> " + screenHeight); 

这在我的应用程序工作正常

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; 
    } 
+0

+1使用Build.VERSION.SDK_INT – user1991679

+0

,但代码有点不正确:getRealSize被添加到API 17 – user1991679

1
int scrWidth = getWindowManager().getDefaultDisplay().getWidth(); 
    int scrHeight = getWindowManager().getDefaultDisplay().getHeight(); 
+1

嗨,您的帖子被标记为“低质量”,可能是因为它只包含代码。你可以通过提供解释这个问题的答案和原因的解释来大幅提高你的答案。 – Ben

+0

它以像素为单位返回宽度和高度 – Nepster

33

内的活动,您可以拨打:

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

当您在一个视图中,那么您需要首先获取上下文:

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

这将在所有Android版本工作,可用,因为API 1,永不过时。

+0

getApplicationContext()用于从Fragment中获取上下文,而不是从View中获取上下文。从视图来看,它将是getContext()。 –

+0

@OliverHausler getContext也可以工作,只要你在视图中。 getApplicationContext既可以在视图和片段中工作,也可以在一个活动中工作。它基本上为您提供了整体应用的上下文,更重要的是在调用资源获取像素大小之前首先获取上下文。如果您有任何问题,请提供一个强制性的投票原因。 –

+0

我还没有投票赞成什么,我只评论说你说的是不正确的,而且是。 “当你在一个视图中,你需要首先获取上下文” - >'int width = getApplicationContext()。getResources()。getDisplayMetrics()。widthPixels;'不能在视图内工作。 –

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; 
0

使用功能

private int[] getScreenSIze(){ 
     DisplayMetrics displaymetrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
     int h = displaymetrics.heightPixels; 
     int w = displaymetrics.widthPixels; 

     int[] size={w,h}; 
     return size; 

    } 

上按一下按钮或在您创建功能的替代方法添加以下代码

int[] screenSize= getScreenSIze(); 
     int width=screenSize[0]; 
     int height=screenSize[1]; 
     screenSizes.setText("Phone Screen sizes \n\n width = "+width+" \n Height = "+height); 

See demo source code