2012-03-19 68 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中检查此数据,并在那里执行碎片更改。