2012-05-03 16 views
8

Vậy làm cách nào để viết mã để phù hợp với điều này? Tôi không muốn rời khỏi các cuộc gọi API không được chấp nhận trong mã của mình, nhưng tôi cũng không muốn mất người dùng với các thiết bị cũ hơn (hơi). Có một số loại cài đặt tương thích mà tôi có thể triển khai không?getSize() không được hỗ trợ trên các phiên bản hệ điều hành Android cũ hơn, getWidth()/getHeight() không được chấp nhận

Rel. đang

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

vs phương pháp cũ:

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

Trả lời

3

tốt nhất (và tốt nhất, tôi có nghĩa là các tùy chọn đó sẽ làm việc khá nhiều mọi lúc) sẽ sử dụng sự phản chiếu. Xem các nguyên tắc Android Backwards Compatibility Backwards Compatibility (được cập nhật vị trí mới của bài viết về phản chiếu).

Trong khi câu trả lời của tyczj sẽ hoạt động hoàn hảo miễn là chức năng không dùng nữa vẫn còn trong SDK, ngay khi chúng bị xóa, bạn sẽ không có cách nào để sử dụng hoặc chạy ứng dụng trên thiết bị cũ nếu bạn vẫn muốn xây dựng so với SDK mới nhất. Phản ánh giải quyết vấn đề này bằng cách tự động phát hiện chức năng một cách hiệu quả trong thời gian chạy, có nghĩa là ngay cả khi bạn xây dựng chống lại ICS, miễn là minSdkVersion là chính xác, bạn có thể chạy ứng dụng trên thiết bị có Gingerbread hoặc Froyo cho thí dụ.

+0

Tôi chưa thấy một phần của tài liệu nhà phát triển - câu trả lời hay. –

+0

Nó khá mơ hồ nếu bạn không biết phải tìm gì, tôi tình cờ gặp nó một cách tình cờ. – RivieraKid

+0

Vì vậy, những gì được phản ánh. Tôi tin rằng liên kết đã chết. – EGHDK

3

bạn có thể làm một cái gì đó như thế này

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

chào mừng bạn đến với thế giới tương thích ngược. –

+0

Điều đó đã làm các trick. Chắc chắn những điều lộn xộn lên mặc dù. –

+0

Thật không may, điều này sẽ chỉ hoạt động miễn là các phương pháp cũ nằm trong SDK xây dựng. @karl_, bạn không nói rõ chính xác tuổi của thiết bị bạn muốn hỗ trợ, nhưng việc sử dụng phản chiếu như trong câu trả lời của tôi sẽ cho phép bạn hỗ trợ mọi phiên bản Android bất kể SDK bạn đang xây dựng. – RivieraKid

11

tôi có hai hàm, gửi ngữ cảnh và chiều cao và chiều rộng của gettin tính bằng pixel.

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

Tôi nghĩ đại loại như vậy RivieraKid được gợi ý, sẽ là một cái gì đó như thế này:

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

Tôi thường có một lớp tức là siêu. BaseActivity với một phương thức chung để có được một điểm với kích thước màn hình hiện tại. Giữ mọi thứ tốt đẹp và sạch sẽ trong hoạt động thực tế.

/** 
* 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; 
} 
Các vấn đề liên quan