2011-12-26 19 views
16

Tôi có một Generic bơi mà tôi đang làm ở đây:Làm cách nào để nhận số liệu Màn hình bên ngoài Hoạt động?

public class FruitPool extends GenericPool<Sprite> { 
// =========================================================== 
// Constants   
// =========================================================== 

// ===========================================================   
// Fields   
// =========================================================== 
private final TextureRegion mTextureRegion; 
private Scene mScene; 
// ===========================================================   
// Constructors   
// =========================================================== 
public FruitPool(final TextureRegion pFruitTextureRegion, Scene mScene2) { 
    this.mTextureRegion = pFruitTextureRegion; 
    this.mScene = mScene2; 
} 
// ===========================================================   
// Getter & Setter   
// =========================================================== 

// ===========================================================   
// Methods for/from SuperClass/Interfaces   
// =========================================================== 
@Override 
protected Sprite onAllocatePoolItem() { 
    Random rand = new Random(); 

     //I want to get the Screens Display metrics here... 
    Sprite fruit = new Sprite(0, 0, this.mTextureRegion); 

    mScene.attachChild(fruit); 

    return fruit; 

} 

tôi đang cố gắng để có được các số liệu màn hình hiển thị như thế này ..

final Display display = getWindowManager().getDefaultDisplay(); 
    CAMERA_WIDTH = display.getWidth(); 
    CAMERA_HEIGHT = display.getHeight(); 

Vấn đề duy nhất là, đó là tôi không thể tìm cách thực hiện điều này bên ngoài Hoạt động ..

Điều này có thể thực hiện được không? Hoặc tôi sẽ phải sử dụng SharedPreference hoặc một cái gì đó?

Trả lời

29

Điều đơn giản nhất là chuyển một Bối cảnh tới hàm tạo FruitPool. Sau đó, nó có thể truy xuất số liệu hiển thị bằng cách gọi Context.getWindowManager(). (Nếu bạn muốn chạy mã bên ngoài các nhà xây dựng, tiết kiệm context.getApplicationContext(), trong trường hợp nó đã được thông qua một bối cảnh hoạt động.)

EDIT: Nếu bạn áp dụng phương pháp này và đang đi qua một Activity đến đối tượng FruitPool, và tuổi thọ của đối tượng FruitPool có thể vượt quá tuổi thọ của hoạt động, khi đó bạn không được giữ tham chiếu đến hoạt động. Thay vào đó, bạn nên tham chiếu đến context.getApplicationContext(). Kể từ getWindowManager() chỉ định nghĩa cho một Activity, bạn thay vì có thể sử dụng biểu thức này để có được những WindowManager:

(WindowManager) context.getSystemService(Context.WINDOW_SERVICE) 
+0

Câu trả lời hay! Tôi chưa bao giờ nghĩ về điều đó! –

+3

Tôi đã thử điều này và nó nói rằng "Phương thức getWindowManager() là không xác định cho loại đối tượng Actext" –

+1

"(context) thay vì ngữ cảnh. ngữ cảnh về cơ bản là siêu lớp của hoạt động và có thể getWindowManager() được định nghĩa trong lớp Ativity –

83

Mặc dù thực tế có một câu trả lời được chấp nhận ở đây, tôi gửi bài trả lời khác. Lý do cho điều này là như sau. Các ngữ cảnh đi qua không phải lúc nào cũng là một ý tưởng hay, bởi vì trong một số trường hợp (ví dụ như các thư viện được áp dụng) các bối cảnh không nên xây dựng các phụ thuộc bổ sung và không cần thiết từ một ứng dụng. Mã này rất đơn giản:

DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); 

Nó cung cấp giải pháp cho các trường hợp khi các giới hạn đã biết của phương pháp này không quan trọng đối với nhà phát triển. Theo tài liệu Android:

getSystem() trả về một đối tượng Tài nguyên chia sẻ toàn cầu cung cấp quyền truy cập vào chỉ tài nguyên hệ thống (không có tài nguyên ứng dụng), và không được cấu hình cho màn hình hiện tại (không thể sử dụng đơn vị kích thước, không thay đổi dựa về định hướng, v.v.)

Dù sao, tất cả các trường DisplayMetrics đều được điền đầy đủ thông tin có ý nghĩa. Trong trường hợp của tôi, đó là DPI mà tôi đã theo đuổi. Và phương pháp này cung cấp cho tôi DPI mà không cần bối cảnh.

+3

Tôi nghĩ câu trả lời này tốt hơn. Cảm ơn, đã làm việc cho tôi. –

+0

Điều đó có hiệu quả đối với tôi. –

+2

Tôi đồng ý rằng bộ câu trả lời này là câu hỏi tốt hơn. Thanks @Stan – Etienne

2

Dưới đây là một cách khác để có được số liệu hiển thị mà được định cấu hình cho màn hình hiện tại.

final DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();

1

Đây là api tôi đã viết để có được độ rộng màn hình, bạn cần một bối cảnh để có được những dịch vụ hệ thống cửa sổ. Tương tự, bạn có thể nhận được chiều cao.

int getWindowWidth() { 
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    return size.x; 
} 
Các vấn đề liên quan