嘿,我需要得到屏幕的宽度在我的应用程序。 该应用程序将在2.1及以上运行。 我已经将它设置类似下面。 该方法已被废弃,我应该proabably使用的getSize或其他方式。 但问题是:在Android版本,这部作品像3.0+ 4.0+和,还是会令应用程序崩溃。 我曾在之前一个线程使用的方法已过时,它让冰淇淋设备的应用程序崩溃。 下面的工作方法?
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;
我不知道这些过时方法是否会在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);
我不知道,但是这可能工作:
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;
}
我已经扩展史蒂夫的有用的代码,使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;
}
据https://stackoverflow.com/a/1016941/2914140 :
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
有什么不对显示器的新功能, 的getSize() ? 这将会是很容易打开Point对象为宽度和高度值需要。