2012-03-19 96 views
5

如果我通過ZXing 2.0庫執行QR碼掃描,我在啓動片段時遇到了一些問題。當我執行這個代碼
ZXing 2.0 QR碼掃描後啓動片段

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* 

@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"); 
      } 
     } 
    } 

我'不知道爲什麼發生這種情況

我得到這個例外。是否可以在ActivityResult的末尾啓動Fragment-Transaction?

Thx爲您的幫助提前。

回答

2

這基本上是因爲您的活動暫停,onActivityResultonSaveInstanceState之後被調用,因此消息:'onSaveInstanceState後無法執行此操作'。如果您有任何需要處理的內容,請保存requestCode,resultCode和intent,並檢入onResume

7

onResume之前可能會調用onActivityResult,並且在活動至少有一個名爲onResume之前無法添加新片段。

因此,您需要將您獲得的數據存儲在onActivityResult中,請在onResume中檢查此數據,並在那裏執行碎片更改。