嘿我需要在我的应用程序中获得屏幕的宽度。该应用程序将在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;
答案 0 :(得分:23)
我不确定,但这可行:
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;
}
答案 1 :(得分: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);
答案 2 :(得分: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;
}
答案 3 :(得分:2)
根据https://stackoverflow.com/a/1016941/2914140:
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
答案 4 :(得分:0)
Display的新功能getSize()有什么问题?将Point对象转换为您需要的宽度和高度值非常容易。