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 laIntent
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.
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.
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);
Llamar a la actividad secundaria Intención utilizando el método startActivityForResult () llamada
Hay un ejemplo de esto aquí: http://developer.android.com/training/notepad/notepad-ex2.html
y en "Devolver un resultado de una pantalla" de esto: http://developer.android.com/guide/faq/commontasks.html#opennewscreen
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);