Sending data back to the Main Activity in Android

后端 未结 12 1926
后悔当初
后悔当初 2020-11-22 01:36

I have two activities: main activity and child activity.
When I press a button in the main activity, the child activity is launched.

Now I want to send some dat

相关标签:
12条回答
  • 2020-11-22 01:57

    Sending Data Back

    It helps me to see things in context. Here is a complete simple project for sending data back. Rather than providing the xml layout files, here is an image.

    Main Activity

    • Start the Second Activity with startActivityForResult, providing it an arbitrary result code.
    • Override onActivityResult. This is called when the Second Activity finishes. You can make sure that it is actually the Second Activity by checking the request code. (This is useful when you are starting multiple different activities from the same main activity.)
    • Extract the data you got from the return Intent. The data is extracted using a key-value pair.

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

    Second Activity

    • Put the data that you want to send back to the previous activity into an Intent. The data is stored in the Intent using a key-value pair.
    • Set the result to RESULT_OK and add the intent holding your data.
    • Call finish() to close the 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();
        }
    }
    

    Other notes

    • If you are in a Fragment it won't know the meaning of RESULT_OK. Just use the full name: Activity.RESULT_OK.

    See also

    • Fuller answer that includes passing data forward
    • Naming Conventions for the Key String
    0 讨论(0)
  • 2020-11-22 01:58

    Just a small detail that I think is missing in above answers.

    If your child activity can be opened from multiple parent activities then you can check if you need to do setResult or not, based on if your activity was opened by startActivity or startActivityForResult. You can achieve this by using getCallingActivity(). More info here.

    0 讨论(0)
  • 2020-11-22 01:59

    In first activity u can send intent using startActivityForResult() and then get result from second activity after it finished using 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();
        }
    }
    
    0 讨论(0)
  • 2020-11-22 02:00

    FirstActivity uses 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");
        }
    }
    

    On SecondActivity call setResult() onClick events or onBackPressed()

    Intent intent=new Intent();
    intent.putExtra("MESSAGE",message);
    setResult(Activity.RESULT_OK, intent);
    
    0 讨论(0)
  • 2020-11-22 02:07

    I have created simple demo class for your better reference.

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

    And here is 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();
    
                }
            });
    
        }
    }
    
    0 讨论(0)
  • 2020-11-22 02:11

    Activity 1 uses startActivityForResult:

    startActivityForResult(ActivityTwo, ActivityTwoRequestCode);
    

    Activity 2 is launched and you can perform the operation, to close the Activity do this:

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

    Activity 1 - returning from the previous activity will call 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);
        }
    }
    

    UPDATE: Answer to Seenu69's comment, In activity two,

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

    Then in activity one,

    int result = data.getExtra(KEY_RESULT);
    
    0 讨论(0)
提交回复
热议问题