vida studio nombre intent ciclo cambiar activity android android-intent

android - studio - intent-filter



Enviando datos a la Actividad Principal en Android (10)

Tengo dos actividades: actividad principal y actividad infantil.
Cuando presiono un botón en la actividad principal, se inicia la actividad secundaria.

Ahora quiero enviar algunos datos a la pantalla principal. Utilicé la clase Bundle, pero no está funcionando. Lanza algunas excepciones de tiempo de ejecución.

¿Hay alguna solución para esto?


Enviando datos de vuelta

Me ayuda a ver las cosas en contexto. Aquí hay un proyecto simple y completo para enviar datos de vuelta. En lugar de proporcionar los archivos de diseño XML, aquí hay una imagen.

Actividad principal

  • Comience la segunda actividad con startActivityForResult , proporcionándole un código de resultado arbitrario.
  • Anular onActivityResult . Esto se llama cuando la segunda actividad termina. Puede asegurarse de que en realidad es la Segunda Actividad verificando el código de solicitud. (Esto es útil cuando está iniciando varias actividades diferentes desde la misma actividad principal).
  • Extrae los datos que obtuviste de la Intent devolución. Los datos se extraen utilizando un par clave-valor.

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

Segunda actividad

  • Coloque los datos que desea enviar a la actividad anterior en una Intent . Los datos se almacenan en la Intent utilizando un par clave-valor.
  • Establezca el resultado en RESULT_OK y agregue la intención que contiene sus datos.
  • Llame a finish() para cerrar la segunda actividad.

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

Otras notas

  • Si estás en un Fragmento, no sabrá el significado de RESULT_OK . Solo usa el nombre completo: Activity.RESULT_OK .

Ver también

  • Respuesta más completa que incluye pasar datos hacia adelante.
  • Convenciones de nomenclatura para la cadena de clave

En First Activity utiliza startActivityForResult:

Intent intent=new Intent(MainActivity.this,SecondActivity.class); startActivityForResult(intent, int resultCode); //suppose resultCode == 2; // Call Back method to get the Message form other Activity @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==2) { String message=data.getStringExtra("MESSAGE"); } }

En SecondActivity, llame a setResult () en eventos de clic o en BackPressed ()

Intent intent=new Intent(); intent.putExtra("MESSAGE",message); setResult(2,intent);


En la primera actividad, puede enviar la intención utilizando startActivityForResultand() y luego obtener el resultado de la actividad secundaria después de que termine de usar 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); } } } }

========= actividad secundaria

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


Hay algunas maneras de hacer esto. 1. usando el startActivityForResult () que está muy bien explicado en las respuestas anteriores.

  1. creando las variables estáticas en su clase "Utils" o cualquier otra clase de su propiedad. Por ejemplo, quiero pasar studentId de ActivityB a ActivityA. Primero, mi ActivityA está llamando a ActivityB. Luego, dentro de ActivityB, establezca studentId (que es un campo estático en Utils.class). Me gusta esto Utils.STUDENT_ID = "1234"; luego, mientras regresa a la ActividadA, use el StudentId que está almacenado en Utils.STUDENT_ID.

  2. creando un método getter y setter en su clase de aplicación.

Me gusta esto:

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

así que has terminado. simplemente establezca los datos en el interior cuando esté en ActivityB y, luego de regresar a ActivityA, obtenga los datos.


Hay un par de maneras de lograr lo que quieres, dependiendo de las circunstancias.

El escenario más común (que es como suena) es cuando se utiliza una actividad infantil para obtener información del usuario, como elegir un contacto de una lista o ingresar datos en un cuadro de diálogo. En este caso, debe usar startActivityForResult para iniciar la actividad de su hijo.

Esto proporciona una canalización para enviar datos a la Actividad principal usando setResult . El método setResult toma un valor de resultado int y un Intent que se devuelve a la Actividad de llamada.

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

Para acceder a los datos devueltos en la actividad de llamada, anule onActivityResult . El startActivityForResult solicitud corresponde al número entero que se pasa en la llamada startActivityForResult , mientras que el código de resultado y el Intento de datos se devuelven desde la Actividad secundaria.

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


He creado una clase de demostración simple para su mejor referencia.

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

Y aquí está 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(); } }); } }


La actividad 1 usa startActivityForResult :

startActivityForResult(ActivityTwo, ActivityTwoRequestCode)

Se inicia la Actividad 2 y puede realizar la operación, para cerrar la Actividad haga esto:

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

Actividad 1: volver de la actividad anterior llamará 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); } }

ACTUALIZACIÓN: Respuesta al comentario de Seenu69, En la actividad dos,

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

Luego en la actividad uno,

int result = data.getExtra(KEY_RESULT);



Solo un pequeño detalle que creo que falta en las respuestas anteriores.

Si su actividad secundaria se puede abrir desde varias actividades principales, puede verificar si necesita hacer setResult o no, según si su actividad fue abierta por startActivity o startActivityForResult . Puedes lograr esto usando getCallingActivity() . Más información here .


Use sharedPreferences y guarde sus datos y acceda a ellos desde cualquier lugar de la aplicación

guarda fecha como esta

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

Y recibe datos como este.

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); String savedPref = sharedPreferences.getString(key, ""); mOutputView.setText(savedPref);