2010-05-18 36 views
15

tôi có mã này:startActivityForResult và Intents Extras, có vẻ như tính năng bổ sung không được đẩy lùi

Intent intent = new Intent(); 
     intent.setAction(Intent.ACTION_PICK); 
     intent.setData(ContactsContract.Contacts.CONTENT_URI); 
     intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag()); 
     startActivityForResult(intent, PICK_CONTACT); 

Sau đó, trên phản ứng:

public void onActivityResult(int reqCode, int resultCode, Intent data) { 


     switch (reqCode) { 
      case (PICK_CONTACT): 
       if (resultCode == Activity.RESULT_OK) { 
        try { 
         Uri contactData = data.getData(); 
         String onlineid = data.getStringExtra(EXTRA_ONLINE_ID); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
       break; 
     } 
     super.onActivityResult(reqCode, resultCode, data); 
    } 

biến onlineid là null. Làm thế nào tôi có thể vượt qua một giá trị và sau đó để nhận lại nó?

EDIT

Tôi thậm chí đã cố gắng,

Bundle extras = data.getExtras(); // returns null 
+0

séc resultCode phải -1 cho Activity.RESULT_OK – Jorgesys

+0

đó là tốt , nó được vào đó nếu, nhưng Extras là trống rỗng. – Pentium10

Trả lời

3

Điều này được thực hiện theo thiết kế; các hoạt động của hệ thống sẽ không gửi lại các tính năng bổ sung mà chúng được gọi, vì vậy bạn phải quản lý dữ liệu ở nơi khác.

May mắn thay, thông số resultCode được kiểm soát hoàn toàn bởi chính bạn, có nghĩa là bạn có thể sử dụng thông số này để lập chỉ mục dữ liệu của mình.

private final int PICK_CONTACT = 0; 
private Bundle[] myDataTransfer = { null }; 

... 

Bundle myData = new Bundle(); 
myData.putString(EXTRA_ONLINE_ID, (String) v.getTag()); 
myDataTransfer[PICK_CONTACT] = myData; 
// create intent and all 
startActivityForResult(intent, PICK_CONTACT); 

... 

public void onActivityResult(int reqCode, int resultCode, Intent data) { 
    if (resultCode == PICK_CONTACT) { 
     Bundle myData = myDataTransfer[resultCode]; 
     String onlineid = myData.getString(EXTRA_ONLINE_ID); 
    } 
} 

Tôi không phải là một lập trình viên Java, có phải là một cách đẹp hơn để thực hiện một bản đồ của Gói, nhưng công trình này :)

+1

Khi bạn bắt đầu một hoạt động, hoạt động của bạn có thể bị giết. Vì vậy, chỉ số sẽ biến mất. Tôi nghĩ bạn sẽ cần phải duy trì Gói ở đâu đó bên ngoài bộ nhớ của ứng dụng. – rumpel

+0

Để thêm vào nhận xét của @rumpel, bạn có thể kiểm tra điều này bằng cách vào Settings> Developer Options và kích hoạt "Don't keep activities". Bằng cách này bạn sẽ có thể kiểm tra usecase này và thấy rằng dữ liệu trong myDataTransfer sẽ bị xóa sạch trừ khi bạn lưu/khôi phục thủ công trong onSaveInstanceState – strangetimes

0

ok Kiểm tra nếu android hoạt động của bạn: launchMode được cấu hình như SingleTask hoặc singleInstance! đó phải là vấn đề :)

+0

Điều này không hữu ích. – Pentium10

+0

Xin chào Pentium10, bạn đã giải quyết vấn đề này chưa? Tôi nghĩ mọi thứ đều ổn trong mã của bạn: S – Jorgesys

+1

Tôi đã không giải quyết. Tôi nghĩ rằng các tính năng bổ sung tùy chỉnh mà chúng tôi chuyển cho hoạt động khác đó không được giữ lại. – Pentium10

0

Tôi cũng đã gặp phải một số vấn đề với vấn đề này.

Thay vì dòng này

intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag()); 

Hãy thử

intent.putExtra(EXTRA_ONLINE_ID, "" + v.getTag()); 
0

Trường EXTRA_ONLINE_ID sẽ phải được thiết lập trong hoạt động mà bạn đưa ra sử dụng setResult. Nếu nó không thiết lập giá trị đó trong Intent được trả về (mà khác với giá trị bạn đã gửi) thì bạn sẽ nhận được một giá trị null.

+0

Như bạn thấy nó sử dụng ContactsContract.Contacts.CONTENT_URI không phải là một phần của cơ sở mã của tôi. – Pentium10

+0

Không thể giúp nó sau đó tôi đoán. Câu hỏi là, tại sao bạn muốn trả lại dữ liệu mà bạn đã có. – Abhinav

+0

Tôi muốn làm cho nó tương thích với các đoạn mã khác. – Pentium10

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