2010-09-29 43 views
22

Khi lập trình cho Android đôi khi bạn phải sử dụng các phương thức tĩnh. Nhưng khi bạn cố gắng truy cập tài nguyên của bạn theo phương pháp tĩnh với getString(R.string.text) bạn sẽ gặp lỗi. Làm cho nó tĩnh không hoạt động.Android: getString (R.string) theo phương thức tĩnh

Có ai biết cách tốt về điều này không? Các tệp tài nguyên trong Android rất hữu ích để tạo mọi thứ bằng các ngôn ngữ khác nhau hoặc thực hiện thay đổi đối với văn bản.

Trả lời

24

Cách này hay cách khác, bạn sẽ cần một bối cảnh cho điều đó ... Đối với các phương pháp tĩnh, điều này có nghĩa là bạn cần phải vượt qua một bối cảnh khi gọi chúng.

6

Vượt qua một ví dụ Context (ví dụ: Activity) làm đối tượng tham số cho phương pháp tĩnh. Sau đó, gọi getString trên tham số.

+0

Đây có thể là một ý tưởng tồi. Nếu bạn đang lưu trữ các tham chiếu đến các ngữ cảnh, bạn có thể gây ra rò rỉ bộ nhớ – Falmarri

+6

Điều gì khiến bạn nghĩ rằng tôi đề xuất lưu trữ một tham chiếu Ngữ cảnh? –

+0

@Falmarri: bạn luôn có thể sử dụng 'getApplicationContext()', sau đó sẽ hợp lệ toàn bộ thời gian ứng dụng –

0

Bài đăng bên dưới cung cấp mẹo để tạo lớp học Application để lưu ngữ cảnh hiện tại của bạn. Lớp Application mới của bạn sau đó sẽ có thể truy cập được từ bất kỳ phương pháp tĩnh nào khác.

How can I get a resource content from a static context?

14

Bạn có thể sử dụng Resources.getSystem().getStringArray(android.R.array.done);

+2

Đây là một giải pháp tốt đẹp chỉ có nhược điểm là bạn chỉ có thể sử dụng tài nguyên hệ thống. –

+1

@ serv-inc - Đó không phải là những gì 'Tài nguyên.getSystem()' [tài liệu] (https://developer.android.com/reference/android/content/res/Resources.html#getSystem()) nói. – aroth

+1

@ serv-inc - Tôi có nghĩa là theo tài liệu tham khảo của Google, nó không quan trọng nếu bạn 'import yourpackage.R; 'khi sử dụng' Resources.getSystem(). GetStringArray() ', vì' Resources.getSystem() 'trả về" một đối tượng Tài nguyên được chia sẻ chung ** cung cấp quyền truy cập vào các tài nguyên hệ thống chỉ ** ". Điều này gợi ý rằng @SarenInden là chính xác và rằng nhận xét tiếp theo sẽ chỉ gửi mọi người xuống đường dẫn sai bằng cách đề xuất họ thử thứ gì đó mà tài liệu chính thức nói rõ ràng sẽ không hoạt động. – aroth

-2

Một cách là bạn có thể vượt qua hoàn cảnh để phương pháp tĩnh của bạn. kiểm tra ra này nó chắc chắn công trình

Sounds public class {

public static MediaPlayer getSoundTouch(Context context){ 
    return MediaPlayer.create(context, R.raw.touch); 

} 

public static MediaPlayer getSoundLeak(Context context){ 
    return MediaPlayer.create(context, R.raw.leak); 

} 

public static MediaPlayer getSoundFinish(Context context){ 
    return MediaPlayer.create(context, R.raw.finish); 

} 

}

2

Đây là cách tôi tiếp cận các nguồn lực từ bên trong phương pháp tĩnh. Có lẽ không lý tưởng, nhưng.

Trước tiên, tôi mở rộng ứng dụng và thiết lập một số lĩnh vực public static (s), và tạo ra một phương pháp để khởi chúng:

public class MyApp extends Application { 

    // static resources 
    public static String APP_NAME; 

    public static void initResources(Context context) { 
    APP_NAME = context.getResources().getString(R.string.app_name); 
    } 
} 

Và trong manifest của tôi, tôi đăng ký các ứng dụng mở rộng:

<application 
    android:name=".MyApp"/> 

Trong hoạt động khởi động của tôi (MainActivity), tôi thực hiện cuộc gọi để khởi tạo các tài nguyên tĩnh:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    MyApp.initResources(this); 
} 

Sau đó, bất cứ nơi nào trong dự án của bạn, sau MainActivity.onCreate (Bundle b) đã chạy, bạn có thể gọi phương thức tĩnh để truy cập vào các tài nguyên tĩnh định của bạn:

public static void printAppName() { 
    Log.w("tag", "my app name: " + MyApp.APP_NAME); 
} 
Các vấn đề liên quan