旧的Android OS版本不支持getSize(),不推荐使用getWidth()/ getHeight()

时间:2012-05-03 20:42:58

标签: android deprecated backwards-compatibility

那么如何编写代码来适应这个?我不想在我的代码中留下已弃用的API调用,但我也不想让(稍微)较旧的设备丢失用户。我可以实现某种兼容性设置吗?

相对。代码

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

VS。旧方法:

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

5 个答案:

答案 0 :(得分:12)

我有两个函数,发送上下文和gettin高度和宽度(以像素为单位)。

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;      
}

答案 1 :(得分:3)

你可以做这样的事情

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH){
           //do stuff pertaining to this version here
}else{
           //other versions
}

答案 2 :(得分:3)

最好(并且最好,我的意思是每次都可以使用的选项)选项是使用反射。查看Android Backwards Compatibility Backwards Compatibility指南(更新了反思文章的新位置)。

虽然tyczj的答案将完美有效,只要已弃用的功能仍在SDK中,一旦删除它们就无法使用它们或在旧设备上运行您的应用程序如果您仍想构建最新的SDK。

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

答案 3 :(得分: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);
    }
}

答案 4 :(得分: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;
}