Como passar dados da 2ª para a 1ª atividade quando pressionado? - android


186

Eu tenho 2 atividades, Activity1 e Activity2 .

Em Activity1Eu tenho um botão e TextView . Quando o botão é clicado, a Atividade2 é iniciada.

Em Activity2eu tenho um EditText .

Desejo exibir os dados recuperados do EditText na Atividade2 no TextView na Atividade1 quando pressionar Voltar da Atividade2 .

alguém pode me ajudar com o código para fazer isso funcionar?


2
leia sobrestartActivityForResult
Dmitry Zaytsev


Outra maneira: Activity2coloca o valor no armazenamento persistente e o Activity1lê a partir daí.
Henry

@kumareloaded: Você poderia compartilhar a solução aqui. Pastebin não está funcionando no meu país a partir de agora.
user1903022

Respostas:


328

Inicie a Activity2 com startActivityForResulte use o setResultmétodo para enviar dados de volta da Activity2 para a Activity1. Na Atividade1, você precisará substituir onActivityResulta atualização TextViewcom os EditTextdados da Atividade2.

Por exemplo:

Na Atividade1 , inicie a Atividade2 como:

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

Na Atividade2 , use setResultpara enviar dados de volta:

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

E na Activity1 , receba dados com 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");
         }     
    }
} 

Se você puder, use também SharedPreferences para compartilhar dados entre as Atividades.


1
graças homem, se você pode você poderia me ajudar com a parte semelhante de codificação para SharedPreferences a fazer o mesmo :)
kumareloaded

1
@kumareloaded: muito bem-vindo amigo. se você quiser fazer o mesmo usando SharedPreferences, veja este exemplo #
# K

2
@kumareloaded: se você me dar links de código de ambas as classes com o que u tentei usar pastebin.com , então eu vou editar o seu código
ρяσѕρєя K

1
@kumareloaded: agora use esse código e isso funcionará #
# K

1
@ ρяσѕρєяK: Você poderia compartilhar o código do cenário acima usando o SharedPref na sua resposta. Pastebin não abre em muitos países. Compartilhá-lo aqui seria de grande ajuda, obrigado.
user1903022

27

Activity1 deve iniciar Activity2 com startActivityForResult().

A Atividade2 deve ser usada setResult()para enviar dados de volta para a Atividade1 .

Na Atividade2 ,

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

Na Atividade1 ,

onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) {
        if(resultCode == RESULT_OK) {
            String myStr=data.getStringExtra("MyData");
            mTextView.setText(myStr);
        }
    }
}

@Swayam Eu acho que porque você não mencionou a atividade1 deve iniciar a atividade2 com startactivityforresult.
LutfiTekin

1
@LutfiTekin: Isso poderia muito bem ser! Obrigado por apontar isso! Editou minha resposta. :)
Swayam

17

Outras respostas não estavam funcionando quando eu coloco setResultno onBackPressed. Comentar a chamada para super onBackPressede chamar finishmanualmente resolve o problema:

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

E na primeira atividade:

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

6

Tome isso como alternativa ao startActivityforResult.Mas, lembre-se de que, nesses casos, essa abordagem pode ser cara em termos de desempenho, mas em alguns casos você pode precisar usar.

Na Atividade2,

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

Na Atividade1,

 @Override
public void onResume() {
SharedPreferences sp = getSharedPreferences("LoginInfos", 0);
String  dataFromOtherAct= sp.getString("email", "no email");
} 

Este não pode ser utilizado para objectos (apenas cadeia, booleano, etc)
FindOut_Quran

1
No meu caso, eu estava iniciando uma atividade a partir de um item da lista no MainActivity e queria recuperar os dados criados pelo usuário para esse item da lista. startActivityForResult () não estava disponível para mim nesse caso em que eu estava usando mContext.startActivity (). O exemplo @katmanco aqui foi uma solução útil.
defeito

para o meu que é uma má eleição. existe actionForResult
marlonpya

3

Na FirstActivity, chame o SecondActivity usando o método startActivityForResult ().

Por exemplo:

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

No SecondActivity, defina os dados que você deseja retornar ao FirstActivity. Se você não quiser voltar, não defina nenhum.

Por exemplo: Em secondActivity, se você deseja enviar dados de volta:

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

Se você não deseja retornar dados:

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

Agora, na sua classe FirstActivity, escreva o código a seguir para o 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
        }
    }
}

2

esta é sua primeira Activity1.

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

A partir daqui, você está iniciando sua Activity2.class usando startActivityForResult (mRequestCode, Activity2.class);

Agora, esta é sua segunda atividade, o nome é 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);
}

}

Agora, quando você termina sua segunda Activity, chama o método setResult (), de onBackPress () ou de qualquer botão, quando a Activity2 destrói, o método de retorno de chamada da Activity1, onActivityResult () , chamará a partir daí, você poderá obter os dados da intenção ..

Espero que ajude a você ... :)



1

TL; DR Use Activity.startActivityForResult

Resposta longa:

Você deve começar lendo a documentação do desenvolvedor do Android. Especificamente, o tópico da sua pergunta é abordado na Starting Activities and Getting Resultsseção da Activitydocumentação.

Como no código de exemplo, o SDK do Android fornece bons exemplos. Além disso, outras respostas aqui fornecem pequenos trechos de código de exemplo para usar.

No entanto, se você estiver procurando por alternativas, leia esta pergunta SO . Esta é uma boa discussão sobre como usar startActivityForResultscom fragmentos, bem como algumas abordagens para a passagem de dados entre atividades.


0

e Eu tenho um problema que eu queria fazer esse tipo de envio de dados em um botão programável que eu criei e a tecla programável que é o padrão em todos os dispositivos Android, então eu fiz isso, primeiro eu fiz um Intentno meu "A" Activity:

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

Então, na minha segunda atividade, declarei um campo no meu "B" Activity:

private static int resultCode = 40;

depois que eu fiz minha solicitação com êxito ou sempre que desejei informar à atividade "A" que este trabalho foi realizado com êxito, altere o valor de resultCode para o mesmo que eu disse em "A", Activityque no meu caso é "60" e então:

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

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

PS: Lembre-se de remover o Supermétodo onBackPressed se você quiser que ele funcione corretamente.

então devo chamar o onActivityResultmétodo na minha atividade "A" também:

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

é isso, espero que ajude você. #HappyCoding;

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.