web-dev-qa-db-ja.com

AndroidでstartActivityForResultを管理する方法

私の活動では、私はstartActivityForResultによってメインの活動から2番目の活動を呼び出しています。私の2番目のアクティビティには、このアクティビティを終了するメソッドがいくつかあります(おそらく結果がない場合もあります)が、そのうちの1つだけが結果を返します。

たとえば、メインアクティビティから2番目のアクティビティを呼び出します。この活動では、私はそれがカメラを持っているかなどの携帯電話のいくつかの機能をチェックしています。そうでなければ、私はこの活動を締めます。また、MediaRecorderまたはMediaPlayerの準備中に問題が発生した場合は、このアクティビティを終了します。

デバイスにカメラがあり、録画が完全に行われている場合、ユーザーが[完了]ボタンをクリックしたときにビデオを録画した後、結果(録画したビデオのアドレス)をメインアクティビティに送信します。

主な活動の結果を確認するにはどうすればいいですか?

893
Hesam

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
2278
Nishant

主な活動の結果を確認するにはどうすればいいですか?

あなたは Activity.onActivityResult() をオーバーライドしてそのパラメータをチェックする必要があります。

  • requestCodeは、どのアプリがこれらの結果を返したかを識別します。これはstartActivityForResult()を呼び出すときにあなたが定義します。
  • resultCodeは、このアプリが成功したのか、失敗したのか、それとも別のものであるのかをお知らせします。
  • dataは、このアプリから返された情報を保持しています。これはnullかもしれません。
46
Sam

@ Nishantからの回答を補足すると、アクティビティの結果を返す最善の方法は次のとおりです。

Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();

私は問題を抱えていました

new Intent();

それから私は正しい方法が使用していることがわかりました

getIntent();

現在の意図を取得する

40
Julian Alberto

全体のプロセスを文脈で見るために、ここに補足的な答えがあります。より詳しい説明は、 私のより完全な答え を参照してください。

enter image description here

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();
    }
}
36
Suragch

OnActivityResultで 間違ったrequestCodeに問題がある人のために

FragmentからstartActivityForResult()を呼び出している場合、requestCodeはフラグメントを所有するActivityによって変更されます。

あなたのアクティビティで正しいresultCodeを取得したい場合はこれを試してください:

変化する:

startActivityForResult(intent, 1);宛先:

getActivity().startActivityForResult(intent, 1);

11

アクティビティの結果でユーザインタフェースを更新したい場合は、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;
    }
}

これは愚かに見えますが、かなりうまくいきます。

10
DaviF

最初に最初のActivityname__にパラメータを指定してstartActivityForResult()を使用し、2番目のActivityname__から最初のActivityname__にデータを送信する場合は、setResult()メソッドでIntentname__を使用して値を渡し、最初のActivityname__のonActivityResult()メソッドにそのデータを入れます。

2

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 
}
}
1
Rohit Singh
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{

}
}
0