322

メインアクティビティと子アクティビティの 2 つのアクティビティがあります。
メイン アクティビティでボタンを押すと、子アクティビティが起動します。

次に、メイン画面にデータを送り返したいと思います。Bundle クラスを使用しましたが、機能しません。いくつかの実行時例外をスローします。

これに対する解決策はありますか?

4

13 に答える 13

508

状況に応じて、あなたが望むものを達成するためのいくつかの方法があります。

最も一般的なシナリオ(あなたのように聞こえます)は、子アクティビティを使用してユーザー入力を取得する場合です。たとえば、リストから連絡先を選択したり、ダイアログボックスにデータを入力したりします。この場合、を使用startActivityForResultして子アクティビティを起動する必要があります。

これにより、を使用してデータをメインアクティビティに送り返すためのパイプラインが提供されますsetResult。setResultメソッドは、int結果値と呼び出し元のActivityに返されるIntentを受け取ります。

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

呼び出し元のアクティビティオーバーライドで返されたデータにアクセスしますonActivityResult。requestCodeは呼び出しで渡された整数に対応しstartActivityForResult、resultCodeとdataIntentは子Activityから返されます。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}
于 2009-06-03T22:14:57.293 に答える
195

アクティビティ 1 はstartActivityForResultを使用します。

startActivityForResult(ActivityTwo, ActivityTwoRequestCode);

アクティビティ 2 が起動され、操作を実行できます。アクティビティを閉じるには、次のようにします。

Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();

アクティビティ 1 - 前のアクティビティから戻ると、onActivityResultが呼び出されます。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
        num1 = data.getIntExtra(Number1Code);
        num2 = data.getIntExtra(Number2Code);
    }
}

更新: Seenu69 のコメントへの回答、アクティビティ 2 で、

int result = Integer.parse(EditText1.getText().toString()) 
           + Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);

次に、アクティビティ 1 では、

int result = data.getExtra(KEY_RESULT);
于 2012-11-13T14:41:58.400 に答える
78

データの返送

状況に応じて物事を見るのに役立ちます。これは、データを送り返すための完全で単純なプロジェクトです。xml レイアウト ファイルを提供するのではなく、ここに画像を示します。

ここに画像の説明を入力

主な活動

  • で 2 番目のアクティビティを開始しstartActivityForResult、任意の結果コードを提供します。
  • オーバーライドしonActivityResultます。これは、2 番目のアクティビティが終了したときに呼び出されます。リクエスト コードを確認することで、実際に 2 番目のアクティビティであることを確認できます。(これは、同じメイン アクティビティから複数の異なるアクティビティを開始する場合に便利です。)
  • return から取得したデータを抽出しますIntent。データは、キーと値のペアを使用して抽出されます。

MainActivity.java

public class MainActivity extends AppCompatActivity {

    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) {

                // 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);
            }
        }
    }
}

第二の活動

  • 前のアクティビティに送り返したいデータを に入れますIntent。データはIntent、キーと値のペアを使用して に格納されます。
  • 結果を に設定しRESULT_OK、データを保持するインテントを追加します。
  • finish()2 番目のアクティビティを閉じるために呼び出します。

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

その他の注意事項

  • あなたがフラグメントにいる場合、それはの意味を知りませんRESULT_OK。フルネームのみを使用してください: Activity.RESULT_OK.

こちらもご覧ください

于 2016-12-05T08:19:47.197 に答える
45

FirstActivity は startActivityForResult を使用します。

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int requestCode); // suppose requestCode == 2

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 2)
    {
        String message=data.getStringExtra("MESSAGE");
    }
}

SecondActivity 呼び出しで setResult() onClick イベントまたは onBackPressed()

Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(Activity.RESULT_OK, intent);
于 2015-12-10T11:31:54.853 に答える
15

startActivityForResult()メソッド呼び出しを使用して子アクティビティIntentを呼び出します

ここにこの例があります:http: //developer.android.com/training/notepad/notepad-ex2.html

そしてこれの「画面から結果を返す」で:http: //developer.android.com/guide/faq/commontasks.html#opennewscreen

于 2009-05-28T12:47:46.400 に答える
9

2021年3月更新

Activity v1.2.0およびFragment v1.3.0と同様に、新しいActivity Result APIsが導入されました。

Activity Result API は、結果の登録、結果の起動、およびシステムによってディスパッチされた結果の処理のためのコンポーネントを提供します。

startActivityForResultしたがって、andを使用する必要はonActivityResultもうありません。

新しい API を使用するには、元のアクティビティで ActivityResultLauncher を作成し、目的のアクティビティが終了して目的のデータを返すときに実行されるコールバックを指定する必要があります。

private val intentLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->

        if (result.resultCode == Activity.RESULT_OK) {
            result.data?.getStringExtra("key1")
            result.data?.getStringExtra("key2")
            result.data?.getStringExtra("key3")
        }
    }

次に、必要なときにいつでもインテントを起動します。

intentLauncher.launch(Intent(this, YourActivity::class.java))

また、宛先アクティビティからデータを返すには、setResult()メソッドに返す値を含むインテントを追加するだけです。

val data = Intent()
data.putExtra("key1", "value1")
data.putExtra("key2", "value2")
data.putExtra("key3", "value3")

setResult(Activity.RESULT_OK, data)
finish()

追加情報については、 Android ドキュメントを参照してください。

于 2021-03-09T17:38:23.997 に答える
6

最初のアクティビティでは、 を使用してインテントを送信し 、使用startActivityForResult()が終了した後に 2 番目のアクティビティから結果を取得できますsetResult

MainActivity.class

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_RESULT_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);
        // send intent for result 
        startActivityForResult(intent, SECOND_ACTIVITY_RESULT_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_RESULT_CODE) {
            if (resultCode == 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.class

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();
    }
}
于 2017-08-05T10:32:53.993 に答える
-1

上記の回答に欠けていると思われる小さな詳細です。

子アクティビティを複数の親アクティビティから開くことができる場合は、アクティビティがまたはsetResultによって開かれたかどうかに基づいて、その必要があるかどうかを確認できます。を使用してこれを実現できます。詳細はこちらstartActivitystartActivityForResultgetCallingActivity()

于 2018-04-26T07:17:20.270 に答える
-3

sharedPreferencesを使用してデータを保存し、アプリケーションのどこからでもアクセスできます

このように日付を保存します

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();

そして、このようなデータを受け取ります

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String savedPref = sharedPreferences.getString(key, "");
    mOutputView.setText(savedPref);
于 2013-07-08T06:43:59.343 に答える