2011-08-31 48 views
6

Trong ứng dụng Android của tôi, tôi có một hoạt động chính tạo hai hoạt động phụ khác thông qua mục đích. Bây giờ, cả hoạt động phụ trả về kết quả cho hoạt động chính. Trong hoạt động chính của tôi, làm cách nào để xử lý hai "onActivityResult (int requestCode, int resultCode, Intent data)" vì nó không thể có hai phương thức có cùng tên trong một lớp nhất định. Hy vọng câu hỏi của tôi là rõ ràng ..Xử lý onActivityResult trong ứng dụng Android có nhiều hoạt động

Cảm ơn

Trả lời

10

Bạn thay đổi requestCode mà bạn sử dụng khi bạn gọi startActivityForResult.

EDIT: ví dụ, tôi sử dụng này:

startActivityForResult(i, App.REQUEST_ENABLE_BT); 

và điều này:

startActivityForResult(i, App.MANUAL_INPUT); 

và sau đó bạn lọc các kết quả như thế này:

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
     super.onActivityResult(requestCode, resultCode, data); 

     if(resultCode == RESULT_OK){ 
      switch(requestCode){ 
      case App.REQUEST_ENABLE_BT: 
       if(resultCode != RESULT_OK){ 
        Toast.makeText(this, getString(R.string.label_bluetooth_disabled), Toast.LENGTH_LONG).show(); 
       } 
       break; 
      case App.MANUAL_INPUT: 
       break; 
     } 
} 
+2

Đây là một thiết kế thực sự xấu. Thực tế, 'Toast' là mã không thể truy cập được, vì bạn chỉ nhập công tắc nếu' resultCode' bằng 'RESULT_OK'. Bạn nên luôn luôn sử dụng một (và duy nhất) 'chuyển đổi 'bên ngoài cho' requestCode', và bên trong mỗi 'trường hợp' kiểm tra cho' resultCodes' khác nhau. Bất kỳ thiết kế nào khác để tiết kiệm một vài dòng mã cuối cùng sẽ là một nguồn lỗi. – thelawnmowerman

9

Đó là những gì requestCode là cho. Vì vậy, bạn sẽ có một thiết lập như thế này

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 
    switch(requestCode) 
     case ACTIVITY1: 
      if(resultCode == RESULT_OK) 
       Toast.makeText(getApplicationContext(), "Activity 1 returned OK", Toast.LENGTH_LONG).show(); 
      break; 
     case ACTIVITY2: 
      if(resultCode == RESULT_OK) 
       Toast.makeText(getApplicationContext(), "Activity 2 returned OK", Toast.LENGTH_LONG).show(); 
      break; 
} 

Trường hợp ACTIVITY1 và ACTIVITY2 là hằng số trong Activity của bạn. Bạn muốn gọi họ như vậy:

startActivityForResult(activity1Intent, ACTIVITY1);

startActivityForResult(activity2Intent, ACTIVITY2);

3

Có thể trả lại bất kỳ loại dữ liệu từ một subactivity trong kết quả tham số ý:

Tiểu hoạt động:

Intent intent = new Intent(); 
intent.putExtra ("string_1", "hello"); 
intent.putExtra ("string_2", "world"); 
intent.putExtra ("int_1", 1000); 
intent.putExtra ("long_1", 2000l); 
activity.setResult (Activity.RESULT_OK, intent); 

_

hoạt động phụ huynh:

@Override 
protected void onActivityResult (int requestCode, int resultCode, Intent intent) 
{ 
    if (resultCode == Activity.RESULT_OK) 
    { 
     String string_1 = intent.getStringExtra ("string_1", ""); 
     String string_2 = intent.getStringExtra ("string_2", ""); 
     int int_1 = intent.getIntExtra ("int_1", 0); 
     long long_1 = intent.getLongExtra ("long_1", 0); 
    } 
} 
1

Bạn có thể sử dụng swicth các requestcode cho kết quả khác nhau

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

     super.onActivityResult(requestCode, resultCode, data); 

     switch (requestCode) { 

      case (1): 
      { 
      // do this if request code is 1. 
      } 
      break; 

      case (2): 
      { 
      // do this if request code is 2. 
      } 
      break; 
    } 
Các vấn đề liên quan