2012-03-19 29 views
5

Tôi gặp một số sự cố khi khởi chạy Phân đoạn nếu tôi thực hiện quét mã QR qua thư viện ZXing 2.0.Khởi chạy Fragment sau khi quét QR Code ZXing 2.0

tôi có ngoại lệ này:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { act=com.google.zxing.client.android.SCAN flg=0x80000 (has extras) }} to activity {fraiss.yucrowd/fraiss.yucrowd.activities.ScanQrCode}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState* 

Khi tôi thực thi mã này:

@Override 
    public void onCreate(Bundle bundle) { 
     // TODO Auto-generated method stub 
     super.onCreate(bundle); 
     setContentView(R.layout.scan_qr_code); 

     Intent intent = new Intent("com.google.zxing.client.android.SCAN"); 
     intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); 
     startActivityForResult(intent, 0); 
    } 

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     if (requestCode == 0) 
     { 
      if (resultCode == RESULT_OK) 
      { 
       String contents = intent.getStringExtra("SCAN_RESULT"); 
       String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); 
       // Handle successful scan 
       Log.d("MENU", "Scan result: " + contents + " as " + format); 

       // Load details for qr code 
        FragmentTransaction fragmentTransaction = getSupportFragmentManager() 
          .beginTransaction(); 

        Fragment fragmentDetails = new FragmentDetails(
          contents); 

        fragmentTransaction 
          .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
        fragmentTransaction.replace(R.id.fragment_main, 
          fragmentDetails); 
        fragmentTransaction.addToBackStack(null); 
        fragmentTransaction.commit(); 
      } 
      else if (resultCode == RESULT_CANCELED) 
      { 
       // Handle cancel 
       Log.d("MENU", "Scan canceled"); 
      } 
     } 
    } 

I'am tự hỏi tại sao điều này xảy ra. Không thể khởi chạy một Fragment-Transaction ở cuối ActivityResult?

Thx để được trợ giúp trước.

Trả lời

2

Điều này về cơ bản xảy ra vì hoạt động của bạn bị tạm dừng, với onActivityResult được gọi sau onSaveInstanceState, do đó thông báo: 'Không thể thực hiện tác vụ này sau khi onSaveInstanceState'. Tiết kiệm requestCode, resultCode và ý định và kiểm tra trong onResume nếu bạn có bất cứ điều gì để làm việc với.

7

Có thể để onActivityResult được gọi trước onResume và bạn không thể thêm đoạn mới trước khi Hoạt động ít nhất được gọi là onResume.

Vì vậy, bạn cần lưu trữ dữ liệu bạn đã nhận được trong onActivityResult, hãy kiểm tra điều này trong onResume và thực hiện các thay đổi Fragment của bạn tại đó.

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