17

嘿,我需要在我的应用程序中获取屏幕的宽度。该应用程序将在 2.1 及更高版本上运行。我已经将它设置为如下所示。该方法已弃用,我可能应该使用 getSize 或其他方式。但问题是:这是否适用于 3.0+ 和 4.0+ 等 android 版本,还是会使应用程序崩溃。我之前在一个线程中使用过一个不推荐使用的方法,它使应用程序在冰淇淋设备上崩溃。下面的方法会起作用吗?

 Display display = getWindowManager().getDefaultDisplay(); 
     int width = display.getWidth();
     int height = display.getHeight();

编辑:

我已经尝试过 getSize 但我没有让它工作:

  Display display = getWindowManager().getDefaultDisplay();
      Point size = new Point();
      display.getSize(size);
      int width = size.x;
      int height = size.y;
4

5 回答 5

25

我不确定,但这可能有效:

if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) {
    Display display = getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    int height = display.getHeight();
} else {
    Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int width = size.x;
    int height = size.y;
}
于 2012-05-18T22:11:51.143 回答
12

我不知道这些已弃用的方法是否适用于 Android 3 和 4。最好的判断方法是在模拟器上进行测试。

但是,为了获得最大兼容性,这里最安全的方法是尝试使用反射的一种方法,然后回退到另一种。本质上,您可以制作自己的版本getSize(),不会失败。我无法测试这个 atm,但它可能看起来像这样:

void overrideGetSize(Display display, Point outSize) {
    try {
      // test for new method to trigger exception
      Class pointClass = Class.forName("android.graphics.Point");
      Method newGetSize = Display.class.getMethod("getSize", new Class[]{ pointClass });

      // no exception, so new method is available, just use it
      newGetSize.invoke(display, outSize);
    } catch(NoSuchMethodException ex) {
      // new method is not available, use the old ones
      outSize.x = display.getWidth();
      outSize.y = display.getHeight();
    }
}

然后当然只是用类似的东西来调用它

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
overrideGetSize(display, size);
于 2012-05-18T22:04:50.370 回答
3

我已经扩展了 Steve 的有用代码,这样 Eclipse 就不会给出任何警告或错误,并且我还对其进行了轻微的重组。由于 Point 类自 API 级别 1 起就存在,我没有看到通过反射创建它有多大好处。

  final static String mTAG = "MYTAG";

  // Cope with deprecated getWidth() and getHeight() methods
  Point getSize(Display xiDisplay) 
  {
    Point outSize = new Point();
    boolean sizeFound = false;

    try 
    {
      // Test if the new getSize() method is available
      Method newGetSize = 
        Display.class.getMethod("getSize", new Class[] { Point.class });

      // No exception, so the new method is available
      Log.d(mTAG, "Use getSize to find screen size");
      newGetSize.invoke(xiDisplay, outSize);
      sizeFound = true;
      Log.d(mTAG, "Screen size is " + outSize.x + " x " + outSize.y);
    } 
    catch (NoSuchMethodException ex) 
    {
      // This is the failure I expect when the deprecated APIs are not available
      Log.d(mTAG, "getSize not available - NoSuchMethodException");
    }  
    catch (InvocationTargetException e) 
    {
      Log.w(mTAG, "getSize not available - InvocationTargetException");
    } 
    catch (IllegalArgumentException e) 
    {
      Log.w(mTAG, "getSize not available - IllegalArgumentException");
    } 
    catch (IllegalAccessException e) 
    {
      Log.w(mTAG, "getSize not available - IllegalAccessException");
    }

    if (!sizeFound)
    {
      Log.i(mTAG, "Used deprecated methods as getSize not available");
      outSize = new Point(xiDisplay.getWidth(), xiDisplay.getHeight());
    }

    return outSize;
  }
于 2012-08-22T22:03:16.657 回答
2

根据https://stackoverflow.com/a/1016941/2914140

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
于 2016-05-23T13:07:32.047 回答
0

Display 的新函数getSize()有什么问题?将 Point 对象转换为您需要的宽度和高度值真的很容易。

于 2012-05-18T21:30:42.910 回答