私の活動では、私はstartActivityForResult
によってメインの活動から2番目の活動を呼び出しています。私の2番目のアクティビティには、このアクティビティを終了するメソッドがいくつかあります(おそらく結果がない場合もあります)が、そのうちの1つだけが結果を返します。
たとえば、メインアクティビティから2番目のアクティビティを呼び出します。この活動では、私はそれがカメラを持っているかなどの携帯電話のいくつかの機能をチェックしています。そうでなければ、私はこの活動を締めます。また、MediaRecorder
またはMediaPlayer
の準備中に問題が発生した場合は、このアクティビティを終了します。
デバイスにカメラがあり、録画が完全に行われている場合、ユーザーが[完了]ボタンをクリックしたときにビデオを録画した後、結果(録画したビデオのアドレス)をメインアクティビティに送信します。
主な活動の結果を確認するにはどうすればいいですか?
FirstActivity
からstartActivityForResult()
メソッドを使ってSecondActivity
を呼び出します
例えば:
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
あなたのSecondActivity
の中で、戻りたいデータをFirstActivity
に設定します。返品したくない場合は設定しないでください。
例えば、SecondActivity
でデータを送り返したい場合は、
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
データを返したくない場合は、
Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
今すぐあなたのFirstActivity
クラスでonActivityResult()
メソッドのための次のコードを書きなさい。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == Activity.RESULT_OK){
String result=data.getStringExtra("result");
}
if (resultCode == Activity.RESULT_CANCELED) {
//Write your code if there's no result
}
}
}//onActivityResult
主な活動の結果を確認するにはどうすればいいですか?
あなたは Activity.onActivityResult()
をオーバーライドしてそのパラメータをチェックする必要があります。
requestCode
は、どのアプリがこれらの結果を返したかを識別します。これはstartActivityForResult()
を呼び出すときにあなたが定義します。resultCode
は、このアプリが成功したのか、失敗したのか、それとも別のものであるのかをお知らせします。data
は、このアプリから返された情報を保持しています。これはnull
かもしれません。@ Nishantからの回答を補足すると、アクティビティの結果を返す最善の方法は次のとおりです。
Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();
私は問題を抱えていました
new Intent();
それから私は正しい方法が使用していることがわかりました
getIntent();
現在の意図を取得する
例
全体のプロセスを文脈で見るために、ここに補足的な答えがあります。より詳しい説明は、 私のより完全な答え を参照してください。
MainActivity.Java
public class MainActivity extends AppCompatActivity {
// Add a different request code for every activity you are starting from here
private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// "Go to Second Activity" button click
public void onButtonClick(View view) {
// Start the SecondActivity
Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
}
// This method is called when the second activity finishes
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// check that it is the SecondActivity with an OK result
if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) { // Activity.RESULT_OK
// get String data from Intent
String returnString = data.getStringExtra("keyName");
// set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
SecondActivity.Java
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
// "Send text back" button click
public void onButtonClick(View view) {
// get the text from the EditText
EditText editText = (EditText) findViewById(R.id.editText);
String stringToPassBack = editText.getText().toString();
// put the String to pass back into an Intent and close this activity
Intent intent = new Intent();
intent.putExtra("keyName", stringToPassBack);
setResult(RESULT_OK, intent);
finish();
}
}
OnActivityResultで 間違ったrequestCodeに問題がある人のために
Fragment
からstartActivityForResult()
を呼び出している場合、requestCodeはフラグメントを所有するActivityによって変更されます。
あなたのアクティビティで正しいresultCodeを取得したい場合はこれを試してください:
変化する:
startActivityForResult(intent, 1);
宛先:
getActivity().startActivityForResult(intent, 1);
アクティビティの結果でユーザインタフェースを更新したい場合は、this.runOnUiThread(new Runnable() {}
を使用することはできません。これを実行しても、UIは新しい値で更新されません。代わりに、これを実行できます。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_CANCELED) {
return;
}
global_lat = data.getDoubleExtra("LATITUDE", 0);
global_lng = data.getDoubleExtra("LONGITUDE", 0);
new_latlng = true;
}
@Override
protected void onResume() {
super.onResume();
if(new_latlng)
{
PhysicalTagProperties.this.setLocation(global_lat, global_lng);
new_latlng=false;
}
}
これは愚かに見えますが、かなりうまくいきます。
最初に最初のActivity
name__にパラメータを指定してstartActivityForResult()
を使用し、2番目のActivity
name__から最初のActivity
name__にデータを送信する場合は、setResult()
メソッドでIntent
name__を使用して値を渡し、最初のActivity
name__のonActivityResult()
メソッドにそのデータを入れます。
Androidで非常によくある問題
これは3つの部分に分けることができます
1)アクティビティBを開始する(アクティビティAで発生)
2)要求されたデータを設定する(アクティビティBで起こる)
3)要求されたデータを受け取る(アクティビティAで起こる)
1)startActivity B
Intent i = new Intent(A.this, B.class);
startActivity(i);
2)要求データを設定する
この部分では、特定のイベントが発生したときにデータを送り返すかどうかを決定します。
例:アクティビティBにはEditTextと2つのボタンb1、b2があります。
ボタンb1をクリックすると、データがアクティビティAに送信されます。
ボタンb2をクリックしてもデータは送信されません。
送信データ
b1......clickListener
{
Intent resultIntent = new Intent();
resultIntent.putExtra("Your_key","Your_value");
setResult(RES_CODE_A,resultIntent);
finish();
}
データを送信していません
b2......clickListener
{
setResult(RES_CODE_B,new Intent());
finish();
}
ユーザーが戻るボタンをクリックします
デフォルトでは、結果はActivity.RESULT_CANCELレスポンスコードで設定されます。
3)検索結果
そのためにはonActivityResultメソッドをオーバーライドします。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RES_CODE_A) {
// b1 was clicked
String x = data.getStringExtra("RES_CODE_A");
}
else if(resultCode == RES_CODE_B){
// b2 was clicked
}
else{
// back button clicked
}
}
You need to override Activity.onActivityResult()
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_CODE_ONE) {
String a = data.getStringExtra("RESULT_CODE_ONE");
}
else if(resultCode == RESULT_CODE_TWO){
// b was clicked
}
else{
}
}