Fragment——startActivity ForResult後onActivity Result無反応の問題まとめ

5852 ワード

最近QRコードスキャンを行うモジュールでは、FragmentでstartActivity ForResultが結果を返すQRコードスキャンのActivityをオンにし、スキャンが完了するとFragmentのonActivity Resultは何の反応もありません.
次は、複数回のテスト後の正しいコードです.
setResultは結果のActivityを返します.
public class CaptureActivity {
    ...
     public static final int SCAN_RESULT = 1;
    ...
     setResult(SCAN_RESULT, resultIntent);
    ...
}

Fragmentコード:
public class TestSubFragment extends HYSubFragment {
    ...
    public static final int SCANNIN_GREQUEST_CODE = 1;
    ...

    /** *   */
    public void startQRCodeScanActivity() {
        Intent intent = new Intent(getActivity(),CaptureActivity.class);
        // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == SCANNIN_GREQUEST_CODE
                && resultCode == CaptureActivity.SCAN_RESULT) {
            Bundle bundle = data.getExtras();
            new MaterialDialog.Builder(getActivity())
                    .title(" ")
                    .content(" :" + bundle.getString("result"))
                    .negativeText(" ")
                    .show();
            textView.setText(bundle.getString("result"));
        }
    }
}

TestSubFragmentに添付されているfragmentActivityのコード:
public class HYSubActivity extends AppCompatActivity {
    ...
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        Toast.makeText(this, "HYSubActivity requestCode:" + requestCode , Toast.LENGTH_LONG).show();
    }
    ...
}

Manifest構成:
    ...
        <activity
            android:name=".HYSubActivity"
            // android:launchMode="singleInstance"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name="cn.toltech.treefrog.qrcodescanner.CaptureActivity"
            android:clearTaskOnLaunch="true"
            android:label="@string/app_name"
            android:screenOrientation="landscape"
            // android:launchMode="singleInstance"
            android:stateNotNeeded="true" >
            <intent-filter>
                <action android:name="com.google.zxing.client.android.SCAN" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    ...

個人テスト後のまとめ:1、FragmentでstartActivity ForResult()を直接使用する;これを使用しないでください.getActivity().startActivityForResult();
2.Fragment添付のActivityでonActivity Result()メソッドを書き換える場合、このメソッドにsuperを付けなければならない.onActivityResult(requestCode, resultCode, data);(ActivityでonActivity Result()メソッドを書き換えないか、親テストが利用可能).FragmentのonActivity Result()メソッドにsuperを付けない.onActivity Result(requestCode,resultCode,data)というコードは結果に影響しません.
3、startActivity ForResult()メソッドが呼び出されたばかりで、activityが戻るのを待っていないので、onActivity Result()メソッドはすでに実行済みです.(親測:実行順序:FragmentのonActivity Result()が先に実行され、ActivityのonActivity Result()が後に実行される)上の問題の原因は、1 manifestのCaptureActivityまたはHYSubActivityのactivityがlaunchMode属性を設定しており、その値が標準モード(standard)ではないためである可能性があります.解決策はlaunchModeプロパティを削除したり、標準モードに設定したりすることです.②FragmentはstartActivity ForResultの時にIntentを使用した.FLAG_ACTIVITY_NEW_TASKは、新しいタスクスタックにジャンプしてonActivity Result()が実行される.解決策はIntentを使用しないことです.FLAG_ACTIVITY_NEW_TASKはActivityをオンにし、他の方法が可能かどうかはテストしていません.