2012-12-19 43 views
7

Tôi cần sự giúp đỡ của bạn, tôi không thể hiểu điều gì đang xảy ra?putExtra treeMap trả về HashMap không thể truyền tới TreeMap android

Tôi đang cố gắng để gửi một TreeMap giữa 2 hoạt động, mã này là một cái gì đó như thế này:

class One extends Activity{ 
public void send(){ 
    Intent intent = new Intent(One.this, Two.class); 
    TreeMap<String, String> map = new TreeMap<String, String>(); 
    map.put("1","something"); 
    intent.putExtra("map", map); 
    startActivity(intent); 
    finish(); 
} 
} 

class Two extends Activity{ 
    public void get(){ 
    (TreeMap<String, String>) getIntent().getExtras().get("map");//Here is the problem 
    } 
} 

này trả về với tôi HashMap không thể được đúc để TreeMap. Điều gì

+0

Đối với các chi tiết đẫm máu của những gì đang xảy ra, xem câu trả lời của tôi ở đây: http://stackoverflow.com/questions/12300886/linkedlist-put-into -intent-extra-gets-recast-to-arraylist-when-retrieving-in-nex/12305459 # 12305459 –

Trả lời

2

Như thay thế cho @ gợi ý Jave, nếu bạn thực sự cần cấu trúc dữ liệu được a TreeMap, chỉ cần sử dụng hàm tạo thích hợp để lấy một bản đồ khác làm nguồn dữ liệu. Vì vậy, vào cuối nhận (Two) làm điều gì đó như:

public class Two extends Activity { 
    @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     TreeMap<String, String> map = new TreeMap<String, String>((Map<String, String>) getIntent().getExtras().get("map")); 
    } 
} 

Tuy nhiên, tùy thuộc vào dự án của bạn, có lẽ bạn không cần phải lo lắng về Map thực hiện chính xác. Vì vậy, trong Thay vào đó, bạn chỉ có thể đúc đến giao diện Map:

public class Two extends Activity { 
    @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Map<String, String> map = (Map<String, String>) getIntent().getExtras().get("map"); 
    } 
} 
1

Âm thanh như nó nối tiếp thành HashMap và đó là những gì bạn đang nhận được. Đoán bạn sẽ phải giải quyết cho một HashMap. Ngoài ra, bạn có thể tạo lớp helper của riêng bạn và thực hiện Parcelable, sau đó tuần tự hóa các khóa/chuỗi theo thứ tự.

+0

Khi bạn đặt bất cứ thứ gì thực hiện giao diện 'Map' vào một' Bundle', nó xuất hiện dưới dạng HashMap. Tương tự với 'List' - bạn luôn nhận được một' ArrayList' từ nó. Xem http://stackoverflow.com/questions/12300886/linkedlist-put-into-intent-extra-gets-recast-to-arraylist-when-retrieving-in-nex/12305459#12305459 –

+0

Thật tuyệt, cảm ơn lời giải thích, Tôi nghi ngờ điều gì đó dọc theo dòng này. Thật tốt khi biết rằng một HashMap đơn giản được hỗ trợ. – dmon

0

Thay vì đúc kết quả trực tiếp đến một TreeMap, bạn có thể tạo mới TreeMap<String, String> và sử dụng putAll() -method:

TreeMap<String, String> myMap = new TreeMap<String, String>; 
HashMap<String, String> receivedMap = getIntent().getExtras().get("map"); 
myMap.putAll(receivedMap);