Fragment——startActivity ForResult後onActivity Result無反応の問題まとめ
5852 ワード
最近QRコードスキャンを行うモジュールでは、FragmentでstartActivity ForResultが結果を返すQRコードスキャンのActivityをオンにし、スキャンが完了するとFragmentのonActivity Resultは何の反応もありません.
次は、複数回のテスト後の正しいコードです.
setResultは結果のActivityを返します.
Fragmentコード:
TestSubFragmentに添付されているfragmentActivityのコード:
Manifest構成:
個人テスト後のまとめ: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をオンにし、他の方法が可能かどうかはテストしていません.
次は、複数回のテスト後の正しいコードです.
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をオンにし、他の方法が可能かどうかはテストしていません.