2011-09-17 4 views
9

Có cách nào để sử dụng phương thức getString từ một lớp riêng biệt không?gọi getString (R.strings ....) từ lớp học?

Tôi đã một chuỗi lưu trữ trong xml chuỗi của tôi, tôi muốn sử dụng chuỗi trong một đối tượng ... nhưng phương pháp này là thậm chí không có sẵn trong các đối tượng ...

bất cứ lời khuyên?

Trả lời

8

giải pháp ở đây là để đảm bảo đối tượng của bạn có một tham chiếu đến bối cảnh ứng dụng

Class Swag{ 
    private Context ctx; 
    public Swag(Context ctx){ 
     this.ctx = ctx; 
    } 
    public void doSomething(){ 
     String something = ctx.getResources().getString(R.string.somestring); 
     ... 
    } 
    // or like this 
    public void makeUpperCase(Context appContext){ 
     appContext.getResources().getString(R.string.super_string_swag_yolo); 
    } 
} 

rõ ràng là bạn phải cung cấp ngữ cảnh khi tạo đối tượng hoặc khi làm tròn phương thức

-3

Hãy thử điều này trong file java của bạn:

String myString = getResources().getString(R.string.MY_STRING)

Bây giờ sử dụng đối tượng chuỗi này.

+0

getResources() là một phương thức của lớp Ngữ cảnh. Bạn không thể sử dụng nó mà không có tham chiếu Context hợp lệ –

+0

Bạn không thể sử dụng getResources. Anh ấy đã giải thích tại sao. – Sotti

10

getString() là phương pháp của lớp Context¹. Nếu bạn cần nó bên trong một lớp riêng biệt (mà không mở rộng Context), nó thường là tốt nhất để cung cấp nó như là một đối số riêng biệt cho các phương pháp cần nó.

Ví dụ:

public void logString(Context c, int stringId) { 
    Log.d("TAG", c.getString(stringId)); 
} 

Một điều rất quan trọng:Never cửa hàng bối cảnh bên trong lớp riêng biệt.
Cung cấp một đối số. Nếu không, bạn sẽ làm mất bộ nhớ và làm gián đoạn toàn bộ vòng đời của android nếu đối tượng lưu trữ ngữ cảnh sống lâu hơn đối tượng nơi ngữ cảnh ban đầu thuộc về (ví dụ: hoạt động).

¹ getString() cũng có thể được sử dụng từ lớp Resources - mà bạn có thể nhận được thông qua Context.getResources()

+0

cảm ơn tôi đã kết thúc việc chuyển ngữ cảnh cho đối tượng vì tôi có thể mở rộng nó để sử dụng nhiều chuỗi hơn, vì vậy tôi không muốn chuyển sang nhiều tham số vì đối tượng lấy dữ liệu từ máy chủ web ... – Mars

+0

Lấy dữ liệu từ web và ngữ cảnh sử dụng: Tùy thuộc vào cách hoạt động của lớp học, tôi khuyên bạn nên xây dựng ['Service'] (http://developer.android.com/reference/android/app/Service.html) (mở rộng Bối cảnh). Điều này làm việc tuyệt vời với vòng đời của Android và cung cấp những gì bạn cần. –

1

chỉnh sửa: dưới đây sẽ KHÔNG làm việc. Tôi đọc nó trên một trang khác và giả sử nó hoạt động, nhưng tôi đã thử nó trong ứng dụng của mình và vẫn gặp lỗi. Vấn đề là, nó sẽ biên dịch nhưng bạn sẽ nhận được một ngoại lệ thời gian chạy.

này sẽ làm việc từ bất kỳ lớp java:

import android.content.res.Resources 

Resources.getSystem().getString(R.string.blah); 
+1

Tôi nghĩ rằng bạn có nghĩa là 'Dưới đây sẽ không làm việc' – TheMethod

+0

cảm ơn cho các cập nhật .. Tôi không thể nhớ tại sao tôi chấp nhận câu trả lời của bạn nhưng điều này chắc chắn sẽ không làm việc ... – Mars

+0

studio không thể tìm thấy phương pháp getSystem() –

6

tệp resouce: giá trị/strings.xml

<resources> 
    <string name="app_name">App name</string> 
<resources> 

java

import android.content.res.Resources; 
Resources.getSystem().getString(R.string.app_name);//result : App name 
+0

studio không thể tìm thấy phương thức getSystem() –

0

nếu bạn không thể vượt qua một bối cảnh như tham số, tạo ra một lớp học, nơi bạn đặt tất cả dữ liệu tĩnh của bạn.

dụ:

public class StaticData { 
    public static String BASE_URL = "https://stackoverflowrocks.com"; 
} 

và nhận được rằng chuỗi từ lớp khác của bạn bằng cách gọi trực tiếp StaticData.BASE_URL

đẹp và sạch sẽ.