¿Cómo pasar datos de la segunda actividad a la primera actividad cuando se vuelve a presionar? - android

186

Tengo 2 actividades, Actividad1 y Actividad2 .

En Activity1Tengo un botón y TextView . Cuando se hace clic en el botón Actividad2 se inicia .

En Activity2Tengo un EditText .

Quiero mostrar los datos recuperados de EditText en Activity2 en TextView en Activity1 cuando se presiona hacia atrás desde Activity2 .

¿Alguien puede ayudarme con el código para que esto funcione?

kumareloaded
fuente
2
leer sobrestartActivityForResult
Dmitry Zaytsev
Otra forma: Activity2coloca el valor en un almacenamiento persistente y lo Activity1lee desde allí.
Henry
@kumareloaded: ¿Podría compartir la solución aquí? Pastebin no está funcionando en mi país a partir de ahora.
user1903022

Respuestas:

328

Inicie Activity2 con startActivityForResulty use el setResultmétodo para enviar datos de vuelta desde Activity2 a Activity1. En la Actividad 1, deberá anular la onActivityResultactualización TextViewcon los EditTextdatos de la Actividad 2.

Por ejemplo:

En Activity1 , inicie Activity2 como:

Intent i = new Intent(this, Activity2.class);
startActivityForResult(i, 1);

En Activity2 , use setResultpara enviar datos de vuelta:

Intent intent = new Intent();
intent.putExtra("editTextValue", "value_here")
setResult(RESULT_OK, intent);        
finish();

Y en la Actividad 1 , reciba datos con onActivityResult:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 1) {
         if(resultCode == RESULT_OK) {
             String strEditText = data.getStringExtra("editTextValue");
         }     
    }
} 

Si puede, también use SharedPreferences para compartir datos entre Actividades.

ρяσѕρєя K
fuente
1
gracias hombre, si puedes puedes ayudarme con la parte de codificación similar para que SharedPreferences haga lo mismo :)
kumareloaded
1
@kumareloaded: bienvenido amigo. si quieres hacer lo mismo usando, SharedPreferencesentonces mira este ejemplo
ρяσѕρєя K
2
@kumareloaded: si me das enlaces de código de ambas clases con lo que has intentado usar pastebin.com, entonces
editaré
1
@kumareloaded: ahora usa este código y esto funcionará
ρяσѕρєя K
1
@ ρяσѕρєяK: ¿Podría compartir el código para el escenario anterior utilizando SharedPref en su respuesta? Pastebin no se abre en muchos países. Compartirlo aquí sería de gran ayuda, gracias.
user1903022
27

Actividad 1 debería iniciar Activity2 con startActivityForResult().

Actividad2 debería usar setResult()para enviar datos de vuelta a Activity1 .

En Activity2 ,

@Override
public void onBackPressed() {
    String data = mEditText.getText();
    Intent intent = new Intent();
    intent.putExtra("MyData", data);
    setResult(resultcode, intent);
}

En Activity1 ,

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}
Swayam
fuente
@Swayam, supongo que porque no mencionaste la actividad1 debería comenzar la actividad2 con startactivityforresult.
LutfiTekin
1
@LutfiTekin: ¡Muy bien podría ser eso! ¡Gracias por mencionarlo! Edité mi respuesta. :)
Swayam
17

Otras respuestas no estaban trabajando cuando pongo setResulten onBackPressed. Comentar la llamada a super onBackPressedy llamar finishmanualmente resuelve el problema:

@Override
public void onBackPressed() {
    //super.onBackPressed();
    Intent i = new Intent();
    i.putExtra(EXTRA_NON_DOWNLOADED_PAGES, notDownloaded);
    setResult(RESULT_OK, i);
    finish();
}

Y en primera actividad:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == QUEUE_MSG) {
        if (resultCode == RESULT_OK) {
            Serializable tmp = data.getSerializableExtra(MainActivity.EXTRA_NON_DOWNLOADED_PAGES);
            if (tmp != null)
                serializable = tmp;
        }
    }
}
FindOut_Quran
fuente
6

Tome esto como una alternativa para iniciarActivityforResult. Pero tenga en cuenta que en tales casos este enfoque puede ser costoso en términos de rendimiento, pero en algunos casos es posible que deba usarlo.

En Activity2,

@Override
public void onBackPressed() {
String data = mEditText.getText();
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
Editor editor = sp.edit();
editor.putString("email",data);
editor.commit();
}

En Activity1,

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 
katmanco
fuente
Esto no se puede usar para el objeto (solo cadena, booleano, etc.)
FindOut_Quran
1
En mi caso, estaba iniciando una actividad desde un elemento de la lista en MainActivity y quería que los datos creados por el usuario volvieran a ese elemento de la lista. startActivityForResult () no estaba disponible para mí en este caso donde estaba usando mContext.startActivity (). El ejemplo de @katmanco aquí fue una solución útil.
Defectuoso
para mi esa es una mala elección. exist actionForResult
marlonpya
3

Desde su FirstActivity, llame a SecondActivity usando el método startActivityForResult ().

Por ejemplo:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

En su SecondActivity, configure los datos que desea devolver a FirstActivity. Si no desea regresar, no configure ninguno.

Por ejemplo: en secondActivity si desea devolver datos:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

Si no desea devolver datos:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Ahora en su clase FirstActivity escriba el siguiente código para el método onActivityResult ().

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}
Manoj Reddy
fuente
2

Esta es tu primera Actividad 1.

public class Activity1 extends Activity{
private int mRequestCode = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, Activity2.class);
    startActivityForResult(intent, mRequestCode);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == mRequestCode && resultCode == RESULT_OK){
        String editTextString = data.getStringExtra("editText");
    }
}
}

Desde aquí, está iniciando su Activity2.class utilizando startActivityForResult (mRequestCode, Activity2.class);

Ahora esta es tu segunda actividad, el nombre es Activity2

public class Activity2 extends Activity {
private EditText mEditText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //mEditText = (EditText)findViewById(R.id.edit_text);

    Intent intent = new Intent();
    intent.putExtra("editText", mEditText.getText().toString());
    setResult(RESULT_OK, intent);
}

}

Ahora, cuando haya terminado con su segunda Actividad, llame al método setResult (), desde onBackPress () o desde cualquier botón, haga clic cuando su Activity2 destruirá y luego el método de devolución de llamada de su Activity1 onActivityResult () llamará desde allí, puede obtener sus datos por intención ..

Espero que te ayude ... :)

vishesh chandra
fuente
1

TL; Uso DR Activity.startActivityForResult

Respuesta larga:

Debería comenzar leyendo la documentación para desarrolladores de Android. Específicamente, el tema de su pregunta está cubierto en la Starting Activities and Getting Resultssección de la Activitydocumentación.

Como por ejemplo, el código, el SDK de Android proporciona buenos ejemplos. Además, otras respuestas aquí le brindan fragmentos breves de código de muestra para usar.

Sin embargo, si está buscando alternativas, lea esta pregunta SO . Esta es una buena discusión sobre cómo usar startActivityForResultscon fragmentos, así como un par de enfoques para pasar datos entre actividades.

Franci Penov
fuente
0

y tengo un problema que quería hacer esto enviando el tipo de datos en un botón programable que había creado y la tecla programable que es la predeterminada en cada dispositivo Android, así que hice esto, primero hice un Intenten mi "A" Activity:

            Intent intent = new Intent();
            intent.setClass(context, _AddNewEmployee.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
            startActivityForResult(intent, 6969);
            setResult(60);

Luego, en mi segunda actividad, he declarado un campo en mi "B" Activity:

private static int resultCode = 40;

luego, después de hacer mi solicitud con éxito o cuando quisiera decirle a la Actividad "A" que este trabajo se realizó con éxito aquí, cambie el valor de resultCode al mismo que dije en "A", Activityque en mi caso es "60" y luego:

private void backToSearchActivityAndRequest() {
    Intent data = new Intent();
    data.putExtra("PhoneNumber", employeePhoneNumber);
    setResult(resultCode, data);
    finish();
}

@Override
public void onBackPressed() {
    backToSearchActivityAndRequest();
}

PD: Recuerde eliminar el Supermétodo onBackPressed si desea que esto funcione correctamente.

entonces también debería llamar al onActivityResultMétodo en mi Actividad "A":

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 6969 && resultCode == 60) {
            if (data != null) {
                    user_mobile = data.getStringExtra("PhoneNumber");
                    numberTextField.setText(user_mobile);
                    getEmployeeByNumber();
            }
        }
    }

eso es todo, espero que te ayude. #HappyCoding;

Arash Afsharpour
fuente