1076

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

たとえば、メインのアクティビティから、2番目のアクティビティを呼び出します。このアクティビティでは、カメラが付いているかどうかなど、受話器のいくつかの機能を確認しています。ない場合は、このアクティビティを閉じます。また、準備中MediaRecorderまたはMediaPlayer問題が発生した場合は、このアクティビティを終了します。

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

メインアクティビティの結果を確認するにはどうすればよいですか?

4

14 に答える 14

2611

から、メソッドを使用してをFirstActivity呼び出します。SecondActivitystartActivityForResult()

例えば:

int LAUNCH_SECOND_ACTIVITY = 1
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, LAUNCH_SECOND_ACTIVITY);

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) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == LAUNCH_SECOND_ACTIVITY) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            // Write your code if there's no result
        }
    }
} //onActivityResult

Kotlinで2つのアクティビティ間でより良い方法でデータを渡す方法を実装するには、アクティビティ間でデータを渡すためのより良い方法を実行してください。

于 2012-05-02T03:36:38.790 に答える
54

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

Activity.onActivityResult()パラメータを上書きして確認する必要があります。

  • requestCodeこれらの結果を返したアプリを特定します。これは、を呼び出すときにあなたが定義しますstartActivityForResult()
  • resultCodeこのアプリが成功したか、失敗したか、または何か違うかを通知します
  • dataこのアプリから返された情報を保持します。これはかもしれませんnull
于 2012-05-02T03:07:14.187 に答える
52

プロセス全体をコンテキストで確認するために、ここに補足的な回答があります。詳細については、私の完全な回答を参照してください。

ここに画像の説明を入力してください

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();
    }
}
于 2016-12-05T08:36:32.750 に答える
47

Nishantからの回答を補完するものとして、アクティビティの結果を返す最良の方法は次のとおりです。

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

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

new Intent();

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

getIntent();

現在の意図を取得します。

于 2015-05-26T20:40:47.470 に答える
20

startActivityForResult:AndroidXでは非推奨

新しい方法についてはregisterForActivityResult

Javaの場合:

 // You need to create a launcher variable inside onAttach or onCreate or global, i.e, before the activity is displayed
 ActivityResultLauncher<Intent> launchSomeActivity = registerForActivityResult(
     new ActivityResultContracts.StartActivityForResult(),
     new ActivityResultCallback<ActivityResult>() {
              @Override
              public void onActivityResult(ActivityResult result) {
                   if (result.getResultCode() == Activity.RESULT_OK) {
                         Intent data = result.getData();
                         // your operation....
                    }
               }
      });

      public void openYourActivity() {
            Intent intent = new Intent(this, SomeActivity.class);
            launchSomeActivity.launch(intent);
      }

Kotlinで:

var resultLauncher = registerForActivityResult(StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data: Intent? = result.data
        // your operation...
    }
}

fun openYourActivity() {
    val intent = Intent(this, SomeActivity::class.java)
    resultLauncher.launch(intent)
}

アドバンテージ:

  1. 新しい方法は、フラグメントまたは別のアクティビティからアクティビティを呼び出すときに直面した複雑さを軽減することです。
  2. 簡単に許可を求めてコールバックを取得する
于 2021-02-24T06:28:42.133 に答える
14

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

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

アクティビティで正しいresultCodeを取得したい場合は、次のことを試してください。

変化する:

startActivityForResult(intent, 1);に:

getActivity().startActivityForResult(intent, 1);

于 2015-10-23T12:58:55.243 に答える
14

ActivityResultRegistryが推奨されるアプローチです

ComponentActivityまたはのメソッドをオーバーライドせずに+フローと+フローActivityResultRegistryを処理できるようになり、を介して型の安全性が向上し、これらのフローをテストするためのフックが提供されるようになりました。startActivityForResult()onActivityResult()requestPermissions()onRequestPermissionsResult()ActivityFragmentActivityResultContract

Android 10Activity1.2.0-alpha02およびFragment1.3.0-alpha02で導入されたActivityResultAPIを使用することを強くお勧めします。

これをあなたに追加してくださいbuild.gradle

def activity_version = "1.2.0-beta01"

// Java language implementation
implementation "androidx.activity:activity:$activity_version"
// Kotlin
implementation "androidx.activity:activity-ktx:$activity_version"

構築済みの契約の使用方法

この新しいAPIには、次のビルド済み機能があります

  1. TakeVideo
  2. PickContact
  3. GetContent
  4. GetContents
  5. OpenDocument
  6. OpenDocuments
  7. OpenDocumentTree
  8. CreateDocument
  9. ダイヤル
  10. 写真を撮る
  11. RequestPermission
  12. RequestPermissions

takePictureコントラクトを使用する例:

private val takePicture = prepareCall(ActivityResultContracts.TakePicture()) { bitmap: Bitmap? ->
    // Do something with the Bitmap, if present
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    button.setOnClickListener { takePicture() }
}

では、ここで何が起こっているのでしょうか。少し分解してみましょう。takePicturenull許容ビットマップを返す単なるコールバックです。nullであるかどうかは、onActivityResultプロセスが成功したかどうかによって異なります。次に、この呼び出しをと呼ばれるprepareCall新しい機能に登録します。後でこれに戻ります。はGoogleが作成した組み込みヘルパーの1つであり、最後に呼び出すと、以前のと同じ方法で実際にインテントがトリガーされます。ComponentActivityActivityResultRegistryActivityResultContracts.TakePicture()takePictureActivity.startActivityForResult(intent, REQUEST_CODE)

カスタム契約の書き方

Intを入力として受け取り、要求されたアクティビティが結果のIntentで返す文字列を返す単純なコントラクト。

class MyContract : ActivityResultContract<Int, String>() {

    companion object {
        const val ACTION = "com.myapp.action.MY_ACTION"
        const val INPUT_INT = "input_int"
        const val OUTPUT_STRING = "output_string"
    }

    override fun createIntent(input: Int): Intent {
        return Intent(ACTION)
            .apply { putExtra(INPUT_INT, input) }
    }

    override fun parseResult(resultCode: Int, intent: Intent?): String? {
        return when (resultCode) {
            Activity.RESULT_OK -> intent?.getStringExtra(OUTPUT_STRING)
            else -> null
        }
    }
}

class MyActivity : AppCompatActivity() {

    private val myActionCall = prepareCall(MyContract()) { result ->
        Log.i("MyActivity", "Obtained result: $result")
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
        button.setOnClickListener {
            myActionCall(500)
        }
    }
}

詳細については、この公式ドキュメントを確認してください。

于 2020-04-03T10:06:46.710 に答える
10

アクティビティの結果でユーザーインターフェイスを更新する場合は、を使用できません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;
    }
}

これはばかげているように見えますが、かなりうまく機能します。

于 2014-03-08T13:54:56.313 に答える
3

Android Xの新しい「方法」を簡単な回答で投稿します(場合によっては、カスタムレジストリや契約が必要ないため)。詳細については、「 アクティビティから結果を取得する」を参照してください。

重要:Android Xの下位互換性には実際にはバグがあるためfragment_version、Gradleファイルに追加する必要があります。そうしないと、「新しい結果APIエラー:requestCodeには下位16ビットしか使用できません」という例外が発生します

dependencies {

    def activity_version = "1.2.0-beta01"
    // Java language implementation
    implementation "androidx.activity:activity:$activity_version"
    // Kotlin
    implementation "androidx.activity:activity-ktx:$activity_version"

    def fragment_version = "1.3.0-beta02"
    // Java language implementation
    implementation "androidx.fragment:fragment:$fragment_version"
    // Kotlin
    implementation "androidx.fragment:fragment-ktx:$fragment_version"
    // Testing Fragments in Isolation
    debugImplementation "androidx.fragment:fragment-testing:$fragment_version"
}

ここで、アクティビティのこのメンバー変数を追加する必要があります。これは、事前定義されたレジストリと一般的なコントラクトを使用します。

public class MyActivity extends AppCompatActivity{

   ...

    /**
     * Activity callback API.
     */
    // https://developer.android.com/training/basics/intents/result
    private ActivityResultLauncher<Intent> mStartForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),

            new ActivityResultCallback<ActivityResult>() {

                @Override
                public void onActivityResult(ActivityResult result) {
                    switch (result.getResultCode()) {
                        case Activity.RESULT_OK:
                            Intent intent = result.getData();
                            // Handle the Intent
                            Toast.makeText(MyActivity.this, "Activity returned ok", Toast.LENGTH_SHORT).show();
                            break;
                        case Activity.RESULT_CANCELED:
                            Toast.makeText(MyActivity.this, "Activity canceled", Toast.LENGTH_SHORT).show();
                            break;
                    }
                }
            });

新しいAPIの前に:

btn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MyActivity .this, EditActivity.class);
                startActivityForResult(intent, Constants.INTENT_EDIT_REQUEST_CODE);
            }
        });

リクエストコードがGoogleフレームワークによって生成(および保持)されていることに気付くかもしれません。 コードは次のようになります。

 btn.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MyActivity .this, EditActivity.class);
                    mStartForResult.launch(intent);
                }
            });
于 2020-12-06T11:00:28.393 に答える
2

startActivityForResult()最初に最初のパラメータで使用し、2番目から最初Activityにデータを送信する場合は、メソッドで使用して値を渡し、最初のメソッド内でそのデータを取得します。ActivityActivityIntentsetResult()onActivityResult()Activity

于 2014-09-30T12:30:37.843 に答える
2

これはAndroidで非常に一般的な問題です

それは3つの部分に分解することができます

  1. アクティビティBを開始します(アクティビティAで発生します)
  2. 要求されたデータを設定します(アクティビティBで発生します)
  3. 要求されたデータを受信します(アクティビティAで発生します)
  1. startActivity B
Intent i = new Intent(A.this, B.class);
startActivity(i);
  1. 要求されたデータを設定する

この部分では、特定のイベントが発生したときにデータを送り返すかどうかを決定します。

例:アクティビティ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応答コードで設定されます

  1. 結果を取得する

そのオーバーライド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{
       // The back button was clicked
    }
}
于 2017-12-22T09:54:47.103 に答える
0

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{

    }
}
于 2019-04-24T13:38:57.017 に答える
0

あなたの主な活動で

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    findViewById(R.id.takeCam).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent=new Intent(getApplicationContext(),TakePhotoActivity.class);
            intent.putExtra("Mode","Take");
            startActivity(intent);
        }
    });
    findViewById(R.id.selectGal).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent=new Intent(getApplicationContext(),TakePhotoActivity.class);
            intent.putExtra("Mode","Gallery");
            startActivity(intent);
        }
    });
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

}

表示する2番目のアクティビティ

private static final int CAMERA_REQUEST = 1888;
private ImageView imageView;
private static final int MY_CAMERA_PERMISSION_CODE = 100;
private static final int PICK_PHOTO_FOR_AVATAR = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_take_photo);

    imageView=findViewById(R.id.imageView);

    if(getIntent().getStringExtra("Mode").equals("Gallery"))
    {
        pickImage();
    }
    else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE);
            } else {
                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraIntent, CAMERA_REQUEST);
            }
        }
    }
}
public void pickImage() {
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == MY_CAMERA_PERMISSION_CODE)
    {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
        {
            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, CAMERA_REQUEST);
        }
        else
        {
            Toast.makeText(this, "Camera Permission Denied..", Toast.LENGTH_LONG).show();
        }
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        imageView.setImageBitmap(photo);
    }
        if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
            if (data == null) {
                Log.d("ABC","No Such Image Selected");
                return;
            }
            try {
                Uri selectedData=data.getData();
                Log.d("ABC","Image Pick-Up");
                imageView.setImageURI(selectedData);
                InputStream inputStream = getApplicationContext().getContentResolver().openInputStream(selectedData);
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                Bitmap bmp=MediaStore.Images.Media.getBitmap(getContentResolver(),selectedData);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch(IOException e){

            }
    }
}
于 2020-08-15T03:37:47.370 に答える
0

Kotlin

AとBが、ナビゲーションがA->Bからのアクティビティであると仮定します。A<-Bからの結果が必要です。

A

    // calling the Activity B
    resultLauncher.launch(Intent(requireContext(), B::class.java))

    // we get data in here from B
    private var resultLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        when (result.resultCode) {
            Activity.RESULT_OK -> {
                result.data?.getStringExtra("VALUE")?.let {
                    // data received here
                }
            }
            Activity.RESULT_CANCELED -> {
                // cancel or failure
            }
        }
    }

B

    // Sending result value back to A
    if (success) {
       setResult(RESULT_OK, Intent().putExtra("VALUE", value))
    } else {
       setResult(RESULT_CANCELED)
    }
于 2022-03-02T12:59:16.240 に答える