web-dev-qa-db-ja.com

Androidのメインアクティビティにデータを送り返す

私は2つの活動をしています:主な活動と子供の活動です。
メインアクティビティでボタンを押すと、子アクティビティが起動します。

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

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

260
Rajapandian

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

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

これは setResult を使ってデータをメインActivityに送り返すためのパイプラインを提供します。 setResultメソッドは、int型のresult値と、呼び出し側の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();

呼び出し側のActivityで返されたデータにアクセスするには、onActivityResultをオーバーライドします。 requestCodeはstartActivityForResult呼び出しで渡された整数に対応し、resultCodeとdata Intentは子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;
    } 
  }
}
430
Reto Meier

アクティビティ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);
171
jimmithy

データを送り返す

それは私が状況の中で物事を見るのを助けます。これはデータを送り返すための完全で単純なプロジェクトです。 xmlレイアウトファイルを提供するのではなく、ここに画像があります。

enter image description here

主な活動

  • 任意の結果コードを指定して、startActivityForResultでSecond Activityを開始します。
  • onActivityResultをオーバーライドします。これは、セカンドアクティビティが終了したときに呼び出されます。リクエストコードをチェックして、それが実際にセカンドアクティビティであることを確認できます。 (これは、同じメインアクティビティから複数の異なるアクティビティを開始しているときに役立ちます。)
  • 戻り値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()を呼び出してSecond Activityを閉じます。

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というフルネームを使用するだけです。

また見なさい

59
Suragch

FirstActivityはstartActivityForResultを使用します。

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int resultCode); // suppose resultCode == 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(2,intent);
24
Vijay

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

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

そして、この "画面から結果を返す"で http://developer.Android.com/guide/faq/commontasks.html#opennewscreen

16
Intrications

参照しやすいように、簡単なデモクラスを作成しました。

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

            }
        });

    }
}
8
Kuls

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

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

これを行うにはいくつかの方法があります。 1.上記の回答で非常によく説明されているstartActivityForResult()を使用します。

  1. あなたの "Utils"クラスまたはあなた自身の他のクラスで静的変数を作成することによって。例えば、私はActivityBからActivityAにstudentIdを渡したいと思います。まず私のActivityAがActivityBを呼び出しています。次にActivityB内でstudentId(Utils.classの静的フィールド)を設定します。 Utils.STUDENT_ID = "1234";次にActivityAに戻るときに、Utils.STUDENT_IDに格納されているstudentIdを使用します。

  2. アプリケーションクラスにゲッターメソッドとセッターメソッドを作成する。

このような:

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に戻ってきたらデータを取得します。

0
swetabh suman

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

これらすべての答えは、データを送信した後に終了する必要があるという2番目のアクティビティのシナリオを説明しています。

しかし、2番目のアクティビティを終了したくない場合や、最初のデータに戻したい場合は、BroadCastReceiverを使用できます。

セカンドアクティビティ -

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()で登録を解除してください

0
Shivam Yadav