2012-03-11 69 views
16

当我实现的getSize()给我的错误

WindowManager wm = ((WindowManager)context.getSystemService(context.WINDOW_SERVICE)); 
Display display = wm.getDefaultDisplay(); 
m_nDisplayWidth = display.getWidth(); 
m_nDisplayHeight = display.getHeight(); 

我可以运行良好,但是当我执行的getSize我得到runtimeError

Point size = new Point(); 
display.getSize(size); //Error right here 
m_nDisplayWidth = size.x; 
m_nDisplayHeight = size.y; 

的logcat:

03-11 01:45:25.865: E/AndroidRuntime(18835): FATAL EXCEPTION: main 
03-11 01:45:25.865: E/AndroidRuntime(18835): android.view.InflateException: Binary XML file line #7: Error inflating class com.brain.development.GameRun 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.view.LayoutInflater.createView(LayoutInflater.java:518) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.view.LayoutInflater.inflate(LayoutInflater.java:408) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:215) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.app.Activity.setContentView(Activity.java:1679) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at com.brain.development.BrainDevelopmentActivity$1.onClick(BrainDevelopmentActivity.java:25) 03-11 01:45:25.865: E/AndroidRuntime(18835): at android.view.View.performClick(View.java:2582) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.view.View$PerformClick.run(View.java:9252) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.os.Handler.handleCallback(Handler.java:587) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.os.Handler.dispatchMessage(Handler.java:92) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.os.Looper.loop(Looper.java:130) 03-11 01:45:25.865: E/AndroidRuntime(18835):  at android.app.ActivityThread.main(ActivityThread.java:3691) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at java.lang.reflect.Method.invokeNative(Native Method) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at java.lang.reflect.Method.invoke(Method.java:507) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at dalvik.system.NativeStart.main(Native Method) 
03-11 01:45:25.865: E/AndroidRuntime(18835): Caused by: java.lang.reflect.InvocationTargetException 
03-11 01:45:25.865: E/AndroidRuntime(18835): at java.lang.reflect.Constructor.constructNative(Native Method) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at android.view.LayoutInflater.createView(LayoutInflater.java:505) 
03-11 01:45:25.865: E/AndroidRuntime(18835): ... 19 more 
03-11 01:45:25.865: E/AndroidRuntime(18835): Caused by: java.lang.NoSuchMethodError: android.view.Display.getSize 
03-11 01:45:25.865: E/AndroidRuntime(18835): at com.brain.development.GameRun$GameThread.<init>(GameRun.java:46) 
03-11 01:45:25.865: E/AndroidRuntime(18835): at com.brain.development.GameRun.<init>(GameRun.java:97) 
03-11 01:45:25.865: E/AndroidRuntime(18835): ... 22 more 

回答

70

这支持新旧设备:

private static Point getDisplaySize(final Display display) { 
    final Point point = new Point(); 
    try { 
     display.getSize(point); 
    } catch (java.lang.NoSuchMethodError ignore) { // Older device 
     point.x = display.getWidth(); 
     point.y = display.getHeight(); 
    } 
    return point; 
} 
+0

getWidth和getHeight自getSize方法到达后不再使用,但仅适用于api级别13和更高版本,因此无法使用旧设备的弃用方法。你的答案+1。谢谢 – Zoombie 2012-10-16 06:23:25

0

尝试改用:

Display display = getWindowManager().getDefaultDisplay(); 

没有这一点,我没有看到在这个代码中的任何问题...

0

试试这个,它适用于我。

getWindowManager().getDefaultDisplay().getWidth(); 
+0

的getWidth()已过时http://developer.android.com/reference/android/view/Display.html#getWidth() – pahan 2013-03-29 10:26:30

0

对不起,我迟到了派对,但请确保您使用的是android sdk 13或更高版本。

+0

如果你想让你的应用在老版本上运行,就像大多数手机一样? – 2012-04-07 19:46:01

4

方法得到显示屏尺寸为所有设备:

private static Point getDisplaySize(final Display display) { 
Point point = new Point(); 
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){ //API LEVEL 13 
    display.getSize(point); 
}else{  
    point.x = display.getWidth(); 
    point.y = display.getHeight(); 
} 
return point; 
    } 

刚开尺寸:

WindowManager wm = ((WindowManager)context.getSystemService(context.WINDOW_SERVICE)); 
    Display display = wm.getDefaultDisplay(); 
    Point myPoint = getDisplaySize(display); 
    Log.i("***Size X::", String.valueOf(myPoint.x)); 
    Log.i("***Size Y::", String.valueOf(myPoint.y)); 
+0

我认为你缺少display.getSize() – Lukos 2013-06-17 14:53:49

+0

非常感谢你Lukos!我编辑了我的回复! =) – Jorgesys 2013-06-17 16:35:58

+1

Build.VERSION.SDK_INT需要Android API级别4或更高。 – Tamara 2013-09-13 07:20:30

0

这里是实用方法,你可以利用:

public static int getWidth(Context context) { 
     WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
     Display display = windowManager.getDefaultDisplay(); 
     Point size = new Point(); 
     int width; 
     if (Build.VERSION.SDK_INT >= 13) { 
      display.getSize(size); 
      width = size.x; 

     } else { 
      width = display.getWidth(); 
     } 
     return width; 
    } 
2

该版本适用于API < 4,太:

@SuppressWarnings("deprecation") 
@TargetApi(VERSION_CODES.HONEYCOMB_MR2) 
public static Point getSize(Display display) { 
    Point point = new Point(); 
    if (sdkInt() >= VERSION_CODES.HONEYCOMB_MR2) { 
     display.getSize(point); 
    } else { 
     point.set(display.getWidth(), display.getHeight()); 
    } 
    return point; 
} 

@SuppressWarnings("deprecation") 
public static int sdkInt() { 
    return Integer.parseInt(VERSION.SDK); 
}