メインアクティビティと子アクティビティの 2 つのアクティビティがあります。
メイン アクティビティでボタンを押すと、子アクティビティが起動します。
次に、メイン画面にデータを送り返したいと思います。Bundle クラスを使用しましたが、機能しません。いくつかの実行時例外をスローします。
これに対する解決策はありますか?
メインアクティビティと子アクティビティの 2 つのアクティビティがあります。
メイン アクティビティでボタンを押すと、子アクティビティが起動します。
次に、メイン画面にデータを送り返したいと思います。Bundle クラスを使用しましたが、機能しません。いくつかの実行時例外をスローします。
これに対する解決策はありますか?
状況に応じて、あなたが望むものを達成するためのいくつかの方法があります。
最も一般的なシナリオ(あなたのように聞こえます)は、子アクティビティを使用してユーザー入力を取得する場合です。たとえば、リストから連絡先を選択したり、ダイアログボックスにデータを入力したりします。この場合、を使用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;
}
}
}
アクティビティ 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);
状況に応じて物事を見るのに役立ちます。これは、データを送り返すための完全で単純なプロジェクトです。xml レイアウト ファイルを提供するのではなく、ここに画像を示します。
startActivityForResult
、任意の結果コードを提供します。onActivityResult
ます。これは、2 番目のアクティビティが終了したときに呼び出されます。リクエスト コードを確認することで、実際に 2 番目のアクティビティであることを確認できます。(これは、同じメイン アクティビティから複数の異なるアクティビティを開始する場合に便利です。)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
.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);
startActivityForResult()メソッド呼び出しを使用して子アクティビティIntentを呼び出します
ここにこの例があります:http: //developer.android.com/training/notepad/notepad-ex2.html
そしてこれの「画面から結果を返す」で:http: //developer.android.com/guide/faq/commontasks.html#opennewscreen
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 ドキュメントを参照してください。
最初のアクティビティでは、 を使用してインテントを送信し 、使用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();
}
}
上記の回答に欠けていると思われる小さな詳細です。
子アクティビティを複数の親アクティビティから開くことができる場合は、アクティビティがまたはsetResult
によって開かれたかどうかに基づいて、その必要があるかどうかを確認できます。を使用してこれを実現できます。詳細はこちら。startActivity
startActivityForResult
getCallingActivity()
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);