startActivity ForResultを呼び出し、onActivity Resultが応答しない解決策
4097 ワード
3つのケース:
1、startActivity ForResultを実行し、呼び出されたActivityが戻るまで待たずにonActivity Result()が実行されます.長い間探していたが、これはActivityのロードモード(launchMode)と関係があり、AndroidManifestで使用できることが分かった.xmlで設定します.以前はsingleInstanceとして設定していましたが、転送または受信が必要なすべてのActivityでは設定できません.または、標準モードに設定するしかありません.そうしないと、startActivity ForResult()の後にonActivity Result()が直接呼び出されます.
Note that this method should only be used with Intent protocols * that are defined to return a result. In other protocols (such as * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may * not get the result when you expect. For example, if the activity you * are launching uses the singleTask launch mode, it will not run in your * task and thus you will immediately receive a cancel result.
2、2つのactivityがデータを転送し、データを返すと、リクエスト側のonActivity Resultは常に応答せず、debugデバッグモードでも呼び出されません.さまざまな構成とプログラムコードが表示され、エラーは見つかりませんでした.その後、APIの説明をよく読むと、startActivity ForResultを呼び出すパラメータの問題だった.つまり、呼び出すときはこうだった.startActivity ForResult(intent,0);値を返し、onActivity Resultメソッドをアクティブにするには、2番目のパラメータの問題です.私が最初に使ったactivityのデフォルト定数:RESULT_OK、コードを追跡したところ、この定数の値は-1で、もちろんonActivity Resultメソッドをアクティブにすることはできません.その後、0より大きい整数に勝手に変更すると、プログラムは成功します.startActivityForResult(intent, 1);//これでいい
API説明:@requestCode If>=0,this code will be returned in onActivity Result()when the activity exits.
3、TabHostのサブActivityでstartActivity ForResultが他のActivityを呼び出すときにonActivity Resultメソッドが応答しないという問題に遭遇する.
ActivityのgetCallingActivity()を呼び出すことで、データを受け入れるActivityを表示できます.
APIは次のように説明しています.
Return the name of the activity that invoked this activity. This is * who the data in {@link #setResult setResult()} will be sent to.
列を挙げると、2つのActivity AとBがあり、AにはstartActivity ForResult(1,new Intent(A,B.class))が実行されます.
AからBへ、BからsetResultを実行してgetCallingActivity()を実行し、Aを表示します.
解決策は次のとおりです.
1.親Activityで他のActivityを起動する.
2.親ActivityのonActivity Resultメソッドを実装し、そこで受信したリクエストを現在アクティブな子Activityに転送する.
3.転送インタフェースをカスタマイズして、第2ステップの転送機能を実現する.
4.サブActivityにおける第3ステップインタフェースを実装する方法は、戻り情報を受信するために使用される.
コードは次のとおりです.
1.親Activityによる他のActivityの起動
2.親Activityを実現するonActivity Resultメソッド
3.カスタムインタフェース
4.サブActivityはonTabActivity Resultメソッドを実装する必要がある
まとめ:Activity自体に前回の親が含まれている場合はstartActivity ForResultを直接使用することはできませんが、getParent()を使用して親からこのメソッドを呼び出します.
1、startActivity ForResultを実行し、呼び出されたActivityが戻るまで待たずにonActivity Result()が実行されます.長い間探していたが、これはActivityのロードモード(launchMode)と関係があり、AndroidManifestで使用できることが分かった.xmlで設定します.以前はsingleInstanceとして設定していましたが、転送または受信が必要なすべてのActivityでは設定できません.または、標準モードに設定するしかありません.そうしないと、startActivity ForResult()の後にonActivity Result()が直接呼び出されます.
Note that this method should only be used with Intent protocols * that are defined to return a result. In other protocols (such as * {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you may * not get the result when you expect. For example, if the activity you * are launching uses the singleTask launch mode, it will not run in your * task and thus you will immediately receive a cancel result.
2、2つのactivityがデータを転送し、データを返すと、リクエスト側のonActivity Resultは常に応答せず、debugデバッグモードでも呼び出されません.さまざまな構成とプログラムコードが表示され、エラーは見つかりませんでした.その後、APIの説明をよく読むと、startActivity ForResultを呼び出すパラメータの問題だった.つまり、呼び出すときはこうだった.startActivity ForResult(intent,0);値を返し、onActivity Resultメソッドをアクティブにするには、2番目のパラメータの問題です.私が最初に使ったactivityのデフォルト定数:RESULT_OK、コードを追跡したところ、この定数の値は-1で、もちろんonActivity Resultメソッドをアクティブにすることはできません.その後、0より大きい整数に勝手に変更すると、プログラムは成功します.startActivityForResult(intent, 1);//これでいい
API説明:@requestCode If>=0,this code will be returned in onActivity Result()when the activity exits.
3、TabHostのサブActivityでstartActivity ForResultが他のActivityを呼び出すときにonActivity Resultメソッドが応答しないという問題に遭遇する.
ActivityのgetCallingActivity()を呼び出すことで、データを受け入れるActivityを表示できます.
APIは次のように説明しています.
Return the name of the activity that invoked this activity. This is * who the data in {@link #setResult setResult()} will be sent to.
列を挙げると、2つのActivity AとBがあり、AにはstartActivity ForResult(1,new Intent(A,B.class))が実行されます.
AからBへ、BからsetResultを実行してgetCallingActivity()を実行し、Aを表示します.
解決策は次のとおりです.
1.親Activityで他のActivityを起動する.
2.親ActivityのonActivity Resultメソッドを実装し、そこで受信したリクエストを現在アクティブな子Activityに転送する.
3.転送インタフェースをカスタマイズして、第2ステップの転送機能を実現する.
4.サブActivityにおける第3ステップインタフェースを実装する方法は、戻り情報を受信するために使用される.
コードは次のとおりです.
1.親Activityによる他のActivityの起動
getParent().startActivityForResult(new Intent(...), REQUEST_CODE);
2.親Activityを実現するonActivity Resultメソッド
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Activity
Activity subActivity = getLocalActivityManager().getCurrentActivity();
//
if (subActivity instanceof OnTabActivityResultListe<wbr>ner) {
//
OnTabActivityResultListe<wbr>ner listener = (OnTabActivityResultListe<wbr>ner) subActivity;
// Activity
listener.onTabActivityResult(requestCode, resultCode, data);
}
super.onActivityResult(requestCode, resultCode, data);
}
3.カスタムインタフェース
public interface OnTabActivityResultListener {
public void onTabActivityResult(int requestCode, int resultCode, Intent data);
}
4.サブActivityはonTabActivity Resultメソッドを実装する必要がある
@Override
public void onTabActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
//
...
}
}
まとめ:Activity自体に前回の親が含まれている場合はstartActivity ForResultを直接使用することはできませんが、getParent()を使用して親からこのメソッドを呼び出します.