Como passar os valores de uma atividade para a atividade anterior

97

Como passo um valor de uma tela para a tela anterior?

Considere este caso: tenho duas atividades. A primeira tela possui um TextViewe um botão e a segunda atividade possui um EditTexte um botão.

Se eu clicar no primeiro botão, ele deverá passar para a segunda atividade e aqui o usuário deverá digitar algo na caixa de texto. Se ele pressionar o botão na segunda tela, os valores da caixa de texto deverão passar para a primeira atividade e isso deverá ser exibido na primeira atividade TextView.

Kumar
fonte

Respostas:

241

Para capturar as ações realizadas em uma atividade dentro de outra, são necessárias três etapas.

Inicie a atividade secundária (sua atividade 'Editar texto') como uma subatividade usando startActivityForResultda sua atividade principal.

Intent i = new Intent(this,TextEntryActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

Dentro da subatividade, em vez de apenas fechar a Activity quando um usuário clica no botão, você precisa criar um novo Intent e incluir o valor do texto inserido em seu pacote de extras. Para passá-lo de volta para a chamada pai setResultantes de chamar finishpara fechar a atividade secundária.

Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

A etapa final está na atividade de chamada: Substituir onActivityResultpara ouvir os retornos de chamada da atividade de entrada de texto. Obtenha o extra do Intent retornado para obter o valor de texto que você deve exibir.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
    case (STATIC_INTEGER_VALUE) : { 
      if (resultCode == Activity.RESULT_OK) { 
      String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
      // TODO Update your TextView.
      } 
      break; 
    } 
  } 
} 
Reto Meier
fonte
27
Tudo isso funcionou para mim, exceto que new Intent(null);era "muito ambíguo" e eu tive que mudar para new Intent();.
Richard Tingle
1
Também é importante notar que isso só funcionará dentro do mesmo contexto. Se você iniciar a atividade a partir de um fragmento, por exemplo, não funcionará porque o requestCode será diferente a cada vez. Você precisará usar getActivity (). StartActivityForResult () no fragmento.
stef
10

Existem algumas maneiras pelas quais você pode acessar variáveis ​​ou objetos em outras classes ou Activity.

A. Banco de dados

B. preferências compartilhadas.

C. Serialização de objetos.

D. Uma classe que pode conter dados comuns pode ser nomeada como Utilitários Comuns, depende de você.

E. Transmissão de dados por meio de intents e interface parcelável.

Depende das necessidades do seu projeto.

A. Banco de dados

SQLite é um banco de dados de código aberto embutido no Android. O SQLite oferece suporte a recursos de banco de dados relacional padrão, como sintaxe SQL, transações e instruções preparadas.

Tutoriais - http://www.vogella.com/articles/AndroidSQLite/article.html

B. Preferências compartilhadas

Suponha que você queira armazenar o nome de usuário. Portanto, haverá agora duas coisas: um nome de usuário chave e um valor de valor.

Como armazenar

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

Usando putString (), putBoolean (), putInt (), putFloat (), putLong (), você pode salvar o tipo de dados desejado.

Como buscar

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

C. Serialização de Objeto

A serlização de objeto é usada se quisermos salvar um estado de objeto para enviá-lo pela rede ou você também pode usá-lo para seu propósito.

Use java beans e armazene-os como um de seus campos e use getters e setter para isso

JavaBeans são classes Java que possuem propriedades. Pense nas propriedades como variáveis ​​de instância privadas. Como são privados, a única maneira de acessá-los de fora da classe é por meio de métodos na classe. Os métodos que alteram o valor de uma propriedade são chamados de métodos setter e os métodos que recuperam o valor de uma propriedade são chamados de métodos getter.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

Defina a variável em seu método de e-mail usando

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

Em seguida, use a serialização de objeto para serializar esse objeto e, em sua outra classe, desserialize esse objeto.

Na serialização, um objeto pode ser representado como uma sequência de bytes que inclui os dados do objeto, bem como informações sobre o tipo do objeto e os tipos de dados armazenados no objeto.

Depois que um objeto serializado é gravado em um arquivo, ele pode ser lido do arquivo e desserializado, ou seja, as informações de tipo e bytes que representam o objeto e seus dados podem ser usados ​​para recriar o objeto na memória.

Se você quiser um tutorial para isso, consulte este link

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

Obter variável em outras classes

D. CommonUtilities

Você pode fazer uma classe por conta própria que pode conter dados comuns que você freqüentemente precisa em seu projeto.

Amostra

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Passagem de dados por intents

Consulte este tutorial para esta opção de transmissão de dados.

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/

Nikhil Agrawal
fonte
6

você não tem que ...

Basta chamar newIntent () da segunda atividade

Intent retData=new Intent();

Adicione dados para transmitir de volta

putExtras (retData.putExtra("userName", getUsrName()));

Vá em frente com setResult

setResult(RESULT_OK, retData);

E pode então terminar

finish();
Sora
fonte
2

Costumo usar variáveis ​​estáticas na atividade de chamada com métodos setter estáticos para defini-las.

Desta forma, posso alterar os valores em qualquer atividade à vontade, independentemente do fluxo exato de controle entre as várias atividades.

Observe que esse truque só pode ser usado se você não se importar com a instanciação de mais de uma cópia da mesma atividade (classe) no aplicativo, embora eu ache que seja o mais fácil de implementar, e eu o uso mais .

Ohad Aloni
fonte
Não é uma ótima solução. Isso vai contra as melhores práticas do Android. Você não pode garantir que uma atividade não será encerrada e uma nova instância iniciada pelo sistema.
SIr Codealot
0

A melhor maneira de fazer aqui é colocar a variável em uma classe comum que é definida fora do escopo

public class Utils 
{
    public static String mPosition;
}

dentro do seu código (por exemplo, OnButtonClick etc ...)

Intent intent = new Intent(Intent.ACTION_PICK, 
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);

dentro do código de

@Override public void onActivityResult (int requestCode, int resultCode, Intent data) {if (requestCode == Keys.PICK_CONTACT) {if (resultCode == Activity.RESULT_OK) {Uri contactData = data.getData ();

            //you may use the variable here after intent result
            LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....
Alp Altunel
fonte