2012-05-03 15 views
8

那麼如何編寫代碼以適應此?我不希望在代碼中留下不建議使用的API調用,但我也不想丟失具有(稍微)較舊設備的用戶。是否有某種我可以實現的兼容性設置?舊版Android操作系統版本不支持getSize(),因此不推薦使用getWidth()/ getHeight()

Rel。代碼

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(); 

回答

3

最好的(和最好的,我的意思是,將工作相當多的選項每次)選項都是使用反射。查看Android Backwards Compatibility Backwards Compatibility指導方針(更新了反射文章的新位置)。

雖然tyczj的答案將完美工作,只要不推薦使用的函數仍然在SDK中,只要它們被移除,您將無法使用它們或者在較舊的設備上運行您的應用程序,如果您仍想構建針對最新的SDK。

反射通過在運行時有效地動態檢測函數來解決此問題,這意味着即使您針對ICS構建,只要minSdkVersion正確,您也可以使用Gingerbread或Froyo for例。

+0

我還沒有看到那部分開發者文檔 - 很好的答案。 –

+0

如果你不知道該找什麼,這很不明顯,我完全偶然發現了它。 – RivieraKid

+0

那麼什麼是反射。我相信這個鏈接現在已經死了。 – EGHDK

3

你可以做這樣的事情

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

歡迎來到向後兼容的世界。 –

+0

這個技巧。不過確實會造成混亂。 –

+0

不幸的是,只有在構建SDK中使用舊的方法時,這纔會起作用。 @karl_,你沒有明確說明你想要支持的設備到底有多老,但是在我的答案中使用反射將允許你支持任何Android版本,而不管你正在構建哪個SDK。 – RivieraKid

11

我有兩個函數,發送上下文和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

我覺得那種事情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); 
    } 
} 
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; 
} 
相關問題