2011-02-08 27 views
10

Tôi vừa nhận thấy rằng, trong khi hầu hết các getters từ một Bundle có khả năng bao gồm một giá trị mặc định, trong trường hợp khóa không tồn tại trong cá thể bó cụ thể đó, getString không có khả năng đó, trả về null nếu trường hợp đó.Giá trị mặc định trên Bundle.getString (String key)

Bất kỳ ý tưởng nào về lý do tại sao và nếu có cách nào đó giải pháp dễ dàng (bằng cách dễ dàng, tôi không phải kiểm tra từng giá trị riêng lẻ hoặc mở rộng lớp Bundle).

Như một ví dụ, ngay bây giờ bạn chỉ có này:

bundle.getString("ITEM_TITLE"); 

Trong khi tôi muốn làm:

bundle.getString("ITEM_TITLE","Unknown Title"); 

Cảm ơn!

Trả lời

11

Bạn sẽ phải quấn nó tự hỏi:

public String getBundleString(Bundle b, String key, String def) 
{ 
    String value = b.getString(key); 
    if (value == null) 
     value = def; 
    return value; 
} 
+0

Đó là những gì tôi nghĩ. Nhưng ý tưởng mở rộng Bundle vẫn có vẻ hơi lộn xộn một chút. Tôi đoán tôi sẽ gắn bó với việc kiểm tra mọi lúc cho thời điểm này :) –

22

Trojanfoe có giải pháp tốt nhất nếu đó là những gì bạn muốn, mặc dù một khi bạn nhận được vào đối phó với giá trị mặc định cho kiểu dữ liệu khác mà bạn sẽ phải làm điều tương tự cho tất cả.

Một giải pháp khác sẽ được kiểm tra để xem nếu gói chứa chìa khóa:

String myString = bundle.containsKey("key") ? bundle.getString("key") : "default"; 

Nó không phải là tốt đẹp như một chức năng, nhưng bạn luôn có thể bọc nó nếu bạn muốn.

+0

Điều này sẽ không hoạt động nếu khóa tồn tại nhưng thuộc loại khác (kiểm tra câu trả lời của tôi để thay thế). Tuy nhiên, nó sẽ hoạt động nếu bạn chắc chắn rằng khóa sẽ chứa một 'Chuỗi' hoặc không tồn tại chút nào, trong trường hợp đó là một giải pháp ngắn hơn (1 dòng so với 2: P). – Felix

+0

Đó là sự thật, nhưng tôi chỉ nghĩ rằng nó được giả định là một chuỗi. Vì vậy, không sử dụng phương pháp này nếu bạn không biết dữ liệu được giải quyết bằng khóa nào trong gói này sẽ là :) – csaunders

7

Một giải pháp khác là để kiểm tra null:

String s = bundle.getString("key"); 
if (s == null) s = "default"; 

Đây là tốt hơn so với giải pháp csaunders' vì Bundle thể chứa chìa khóa tương ứng nhưng nó có thể là một loại khác nhau (ví dụ như một int), trong trong trường hợp đó, giải pháp của anh ta sẽ dẫn đến kết quả là myStringnull, thay vì "default".

Các vấn đề liên quan