2013-02-19 30 views
43

Có cách nào dễ dàng để in nội dung của một Bundle tới Logcat nếu bạn không thể nhớ tên của tất cả các phím (thậm chí có thể in chỉ các tên khóa sẽ được làm mát)?In nội dung của một Bundle để Logcat?

Cảm ơn!

Trả lời

79

Bundle#keySet() sẽ hoạt động.

for (String key: bundle.keySet()) 
{ 
    Log.d ("myApplication", key + " is a key in the bundle"); 
} 

Và nếu bạn muốn lấy Object, bạn có thể sử dụng Bundle#get(String key)(which is also in the same documentation I linked at the top of my answer). Tuy nhiên, hãy nhớ sử dụng lệnh gọi chung số get():

  • Bạn đang làm việc với Object. Nếu bạn chỉ cần in vào Nhật ký, toString() sẽ được gọi và tất cả sẽ ổn. Tuy nhiên, nếu bạn thực sự muốn sử dụng cặp khóa, bạn cần thực hiện instanceof kiểm tra để tránh gọi phương thức sai.
  • Vì toString sẽ được gọi, nếu bạn có một đối tượng đặc biệt (ví dụ ArrayLists, hoặc đặc biệt Serializable/Parcelable extras) bạn có nhiều khả năng sẽ không nhận được bất cứ điều gì hữu ích từ bản in.
+2

Tôi nghĩ bạn có nghĩa là 'bundle.keySet()' (vì liên kết tài liệu của bạn là tốt); nếu không thì điều này là chính xác. – Eric

+1

@Eric gah, lỗi ngớ ngẩn. Ít nhất tôi đánh vần nó một cách chính xác khi tôi liên kết với nó. –

28

Bạn có thể nhận cụ thể hơn bằng cách in các giá trị ánh xạ như sau:

for (String key : bundle.keySet()) 
{ 
    Log.d("Bundle Debug", key + " = \"" + bundle.get(key) + "\""); 
} 
15

Bundle-to-string chuyển đổi:

public static String bundle2string(Bundle bundle) { 
    if (bundle == null) { 
     return null; 
    } 
    String string = "Bundle{"; 
    for (String key : bundle.keySet()) { 
     string += " " + key + " => " + bundle.get(key) + ";"; 
    } 
    string += " }Bundle"; 
    return string; 
} 

Ví dụ sử dụng:

Log.d(TAG,"details="+bundle2string(details)); 

và đầu ra:

details=Bundle{ RESPONSE_CODE => 5; }Bundle 

Lưu ý rằng các mũi tên => và dấu chấm phẩy ; cho phép bạn đề cập đến khoảng trắng trong khóa và giá trị. Một dấu cách trước mũi tên, một dấu cách sau mũi tên, không có dấu cách trước dấu chấm phẩy, một dấu cách sau dấu chấm phẩy, một dấu cách sau { và một dấu cách trước } và tất cả các không gian khác đều ở đó bởi vì chúng nằm trong khóa hoặc giá trị.

+0

Giải pháp tốt, nhưng tôi thà sử dụng StringBuffer để có hiệu suất tốt hơn: 'chuỗi tĩnh công cộng bundle2string (bó bó) { StringBuffer buf = new StringBuffer (" Bundle {"); cho (Chuỗi khóa: bundle.keySet()) buf.append ("" + phím + "=>" + bundle.get (khóa) + ";"); buf.append ("} Gói"); return buf.toString(); } ' – Maurix

+1

Hiệu năng IMO không liên quan đến mục đích của _bundle2string() _, nhưng ngay cả khi chúng ta giả định ngược lại, theo http://stackoverflow.com/a/4649160/755804, _String nối được dịch thành các hoạt động StringBuilder bởi compiler._ Tôi đã không kiểm tra bản thân mình cho Android; nếu ai đó quan tâm đến việc kiểm tra điều này, vui lòng xác nhận hoặc bác bỏ. – 18446744073709551615

+0

@Maurix Vì không có chủ đề liên quan, StringBuilder là tốt hơn so với StringBuffer: https://developer.android.com/reference/java/lang/StringBuffer.html –

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