8

那么我该如何编写代码来适应这种情况呢?我不想在我的代码中留下弃用的 API 调用,但我也不想失去使用(稍微)旧设备的用户。我可以实施某种兼容性设置吗?

相对。代码

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int screen_width = size.x;
int screen_height = size.y;

与旧方法相比:

int screen_width = getWindowManager().getDefaultDisplay().getWidth();
int screen_height = getWindowManager().getDefaultDisplay().getHeight();
4

5 回答 5

13

我有两个功能,发送上下文和获取以像素为单位的高度和宽度。

public static int getWidth(Context mContext){
    int width=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>Build.VERSION_CODES.HONEYCOMB){                   
        Point size = new Point();
        display.getSize(size);
        width = size.x;
    }
    else{
        width = display.getWidth();  // deprecated
    }
    return width;
}

public static int getHeight(Context mContext){
    int height=0;
    WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    if(Build.VERSION.SDK_INT>Build.VERSION_CODES.HONEYCOMB){               
        Point size = new Point();
        display.getSize(size);
        height = size.y;
    }else{          
        height = display.getHeight();  // deprecated
    }
    return height;      
}
于 2012-11-23T19:02:03.993 回答
3

你可以做这样的事情

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
           //do stuff pertaining to this version here
}else{
           //other versions
}
于 2012-05-03T20:44:53.160 回答
3

最好的(最好的,我的意思是几乎每次都可以使用的选项)选项是使用反射。查看 Android向后兼容性 向后兼容性指南(更新了关于反射的文章的新位置)。

虽然 tyczj 的答案将完美地工作,只要弃用的功能仍在 SDK 中,一旦它们被删除,如果您仍想针对最新的 SDK 构建,您将无法使用它们或在旧设备上运行您的应用程序.

反射通过在运行时有效地动态检测函数来解决这个问题,这意味着即使您针对 ICS 构建,只要 minSdkVersion 是正确的,您就可以让您的应用程序在带有 Gingerbread 或 Froyo 的设备上运行。

于 2012-05-03T20:51:04.997 回答
1

我认为 RivieraKid 的建议是这样的:

static Point getDisplaySize(Display d)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        return getDisplaySizeGE11(d);
    }
    return getDisplaySizeLT11(d);
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
static Point getDisplaySizeGE11(Display d)
{
    Point p = new Point(0, 0);
    d.getSize(p);
    return p;
}
static Point getDisplaySizeLT11(Display d)
{
    try
    {
        Method getWidth = Display.class.getMethod("getWidth", new Class[] {});
        Method getHeight = Display.class.getMethod("getHeight", new Class[] {});
        return new Point(((Integer) getWidth.invoke(d, (Object[]) null)).intValue(), ((Integer) getHeight.invoke(d, (Object[]) null)).intValue());
    }
    catch (NoSuchMethodException e2) // None of these exceptions should ever occur.
    {
        return new Point(-1, -1);
    }
    catch (IllegalArgumentException e2)
    {
        return new Point(-2, -2);
    }
    catch (IllegalAccessException e2)
    {
        return new Point(-3, -3);
    }
    catch (InvocationTargetException e2)
    {
        return new Point(-4, -4);
    }
}
于 2013-04-17T14:03:39.790 回答
0

我通常有一个超级类,即。BaseActivity 具有通用方法,用于获取当前屏幕大小的点。在实际活动中保持一切整洁。

/**
 * Return screen size as a point.
 * @return
 */
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
@SuppressWarnings("deprecation")
protected Point getSize() {
    final Point point = new Point();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
        getWindowManager().getDefaultDisplay().getSize(point);
    }
    else {
        final Display display = getWindowManager().getDefaultDisplay();
        point.x = display.getWidth();
        point.y = display.getHeight();
    }
    return point;
}
于 2014-05-22T06:53:04.180 回答