Запуск фрагмента после сканирования QR-кода ZXing 2.0 - PullRequest
5 голосов
/ 19 марта 2012

У меня возникают проблемы при запуске фрагмента, если я выполняю сканирование QR-кода через библиотеку ZXing 2.0.

Я получил это исключение:

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

Мне интересно, почему это происходит. Разве невозможно запустить Fragment-Transaction в конце ActivityResult?

Спасибо за вашу помощь заранее.

Ответы [ 2 ]

8 голосов
/ 29 июля 2012

Возможно вызвать onActivityResult до onResume, и вы не можете добавлять новые фрагменты до того, как действие хотя бы под названием onResume.

Поэтому вам необходимо сохранить данные, которые вы получили в onActivityResult, проверить это в onResume и выполнить там изменения фрагмента.

2 голосов
/ 16 апреля 2012

Это в основном происходит потому, что ваша деятельность приостановлена, при этом onActivityResult вызывается после onSaveInstanceState, поэтому появляется сообщение: «Не удается выполнить это действие после onSaveInstanceState».Сохраните requestCode, resultCode и intent и отметьте onResume, если вам есть с чем работать.

...