私には2つの活動があります。メインの活動と子供の活動です。
メインアクティビティのボタンを押すと、子アクティビティが起動します。
次に、データをメイン画面に送り返します。Bundleクラスを使用しましたが、機能しません。いくつかの実行時例外がスローされます。
これに対する解決策はありますか?
私には2つの活動があります。メインの活動と子供の活動です。
メインアクティビティのボタンを押すと、子アクティビティが起動します。
次に、データをメイン画面に送り返します。Bundleクラスを使用しましたが、機能しません。いくつかの実行時例外がスローされます。
これに対する解決策はありますか?
回答:
状況に応じて、目的を達成する方法はいくつかあります。
最も一般的なシナリオ(これはあなたの音です)は、子アクティビティを使用してユーザー入力を取得する場合です(リストから連絡先を選択する、ダイアログボックスにデータを入力するなど)。この場合は、を使用startActivityForResult
して子アクティビティを起動する必要があります。
これは、を使用してデータをメインアクティビティに送り返すためのパイプラインを提供しsetResult
ます。setResultメソッドは、intの結果値と、呼び出し元のアクティビティに渡されるインテントを受け取ります。
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とdata Intentは子アクティビティから返されます。
@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;
}
}
}
startActivityForResult
は、単にではなく関数を使用する必要がありますstartActivity
。たとえばstartActivityForResult(myIntent, 2);
、2が結果コードで、MY_CHILD_ACTIVITY
上記のswitchステートメントの代わりになる場合があります。
アクティビティ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
任意の結果コードを指定して、2番目のアクティビティをで開始します。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
参考のために、簡単なデモクラスを作成しました。
FirstActivity.java
public class FirstActivity extends AppCompatActivity {
private static final String TAG = FirstActivity.class.getSimpleName();
private static final int REQUEST_CODE = 101;
private Button btnMoveToNextScreen;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(mIntent, REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if(requestCode == REQUEST_CODE && data !=null) {
String strMessage = data.getStringExtra("keyName");
Log.i(TAG, "onActivityResult: message >>" + strMessage);
}
}
}
}
そしてここにSecondActivity.javaがあります
public class SecondActivity extends AppCompatActivity {
private static final String TAG = SecondActivity.class.getSimpleName();
private Button btnMoveToPrevious;
private EditText editText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
editText = (EditText) findViewById(R.id.editText);
btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = editText.getEditableText().toString();
Intent mIntent = new Intent();
mIntent.putExtra("keyName", message);
setResult(RESULT_OK, mIntent);
finish();
}
});
}
}
最初のアクティビティでは、uはインテントを使用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();
}
}
これらのすべての回答は、データを送信した後に完了する必要がある2番目のアクティビティのシナリオを説明しています。
ただし、2番目のアクティビティを終了せずに、最初にデータを送り返す場合は、BroadCastReceiverを使用できます。
2番目のアクティビティ-
Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
最初のアクティビティ-
private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do some action
}
};
onCreate()にレシーバーを登録します
LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));
onDestroy()で登録を解除する
これにはいくつかの方法があります。1.上記の回答で非常によく説明されているstartActivityForResult()を使用する。
"Utils"クラスまたは他の独自のクラスに静的変数を作成する。たとえば、ActivityBからActivityIdにstudentIdを渡したいと思います。最初に、私のActivityAがActivityBを呼び出しています。次に、ActivityB内でstudentId(Utils.classの静的フィールド)を設定します。このようにUtils.STUDENT_ID = "1234"; 次に、ActivityAに戻って、Utils.STUDENT_IDに保存されているstudentIdを使用します。
アプリケーションクラスにゲッターメソッドとセッターメソッドを作成します。
このような:
public class MyApplication extends Application {
private static MyApplication instance = null;
private String studentId="";
public static MyApplication getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public void setStudentId(String studentID){
this.studentId=studentID;
}
public String getStudentId(){
return this.studentId;
}
}
これで完了です。uがActivityBにあるときにデータを内部に設定し、ActivityAに戻ってデータを取得します。
上記の回答で欠けていると思う細部。
子アクティビティを複数の親アクティビティから開くことができる場合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);