Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Passagem de dados entre Activities

Bom dia, Estou começando na programação Java e tentando fazer uma espécie de cadastro com base nos programas ensinados nos crusos de android. Uma duvida que estou tendo é na passagem de dados entre as activities. O processo imaginado é o seguinte: 1ºEntro no formulario do Aluno/Pessoa 2°Clico em um botão que me leva a outra activity com a lista de produtos já cadastrados 3°Seleciono os produtos referentes àquela pessoa 4ºFinalizo a seleção e volto para a tela de formulario trazendo os produtos selecionados Porém estou em duvida de como transferir esses dados e de como recebe-los na activity que já está iniciada, pois quando tentei recebe-las o android studio já apresentou erro na hora que a activity formulario foi iniciada pela primeira vez.

Segue primeiras tentativas: (Código resumido)

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario_aluno);
        inicializacaoDosCampos();
        carregaAluno();
        configuraBotaoSelecao();
    }

    @Override
    protected void onResume() {
        super.onResume();
        Bundle bundle = getIntent().getExtras();
        List<Integer> lista = bundle.getIntegerArrayList("nSelecionados");
    }

    private void configuraBotaoSelecao() {
        Button botaoSelecao = findViewById(R.id.activity_formulario_aluno_seleciona_compras);
        botaoSelecao.setOnClickListener(view -> abreListaComprasSelecao());
    }

    private void abreListaComprasSelecao() {
        startActivity(new Intent(this, ListaSelecaoComprasActivity.class));

    }
}

Activity de selecão das compras:

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_selecao_compras);
        setTitle(TITULO_APPBAR);
        configuraLista();
    }

    @Override
    protected void onResume() {
        super.onResume();
        listaComprasView.atualizaSCompras();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater()
                .inflate(R.menu.activity_lista_selecao_compras_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        if(itemId == R.id.activity_lista_selecao_compra_menu_salvar){
            finalizaFormulario();
        }
        return super.onOptionsItemSelected(item);
    }

    private void finalizaFormulario() {
        Intent intent = new Intent(ListaSelecaoComprasActivity.this, FormularioAlunoActivity.class);
        intent.putIntegerArrayListExtra("nSelecionados", nSelecionados);
        finish();
    }

    private void configuraLista() {
        ListView listaDeCompras = findViewById(R.id.activity_lista_selecao_compras_listview);
        listaComprasView.configuraSAdapter(listaDeCompras);
        configuraListenerDeCliquePorItem(listaDeCompras);
        registerForContextMenu(listaDeCompras);
    }

    private void configuraListenerDeCliquePorItem(ListView listaDeCompras) {
        listaDeCompras.setOnItemClickListener((adapterView, view, posicao, id) -> {
            Compra compraEscolhida = (Compra) adapterView.getItemAtPosition(posicao);
            Toast.makeText(this, compraEscolhida.getNome()+" Escolhido", Toast.LENGTH_SHORT).show();
            nSelecionados.add(posicao);
        });
    }
}
3 respostas

Olá Thiago. vc precisa retornar para activity novo obj ou um obj atualizado. correto ?

enviando objeto para activity:

Intent intent = new Intent(this, ListaSelecaoComprasActivity.class);
intent.putExtra("chaveDoObjeto", new Pessoa()); // Obj Pessoa precisa implementar Serializable
startActivityForResult(intent, 1);

recebendo objeto na outra activity:

if(intent.hasExtra("chaveDoObjeto")){
    Pessoa pessoa = (Pessoa) intent.getSerializableExtra("chaveDoObjeto");
}

retornando obj para activity que chamou:

setResult(Activity.RESULT_OK,intent); // intent com obj Pessoa atualizada,
finish();

recebendo resultado da activity : para isso vc precisa fazer um Override do método onActivityResult e utilizar o codigo de requisição e de resposta para pegar o objeto enviado na Intent:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // fazer um check para verificar o código de requisição e o de resposta
        if (requestCode == 1) {
            if(resultCode == Activity.RESULT_OK){
                Pessoa message = (Pessoa) data.getSerializableExtra("chaveDoObjeto");    
            }
        }
    }

Olá William, muito obrigado pela ajuda.

Como ainda não peguei muito bem a intuição do Java, tenho umas dificuldades meio bestas hehe. Poderia me dizer aonde eu declararia a função

if(intent.hasExtra("chaveDoObjeto")){
    Pessoa pessoa = (Pessoa) intent.getSerializableExtra("chaveDoObjeto");
}

Fiquei testando pra ver se descobria sozinho mas ainda não rolou. É no próprio OnCreate? E eu declaro o "intent" na segunda activity na criação ou ela deve identificar sozinha?

solução!

então Thiago, eu esqueci de mencionar como pega a Intent.

mas é só vc chamar o método getIntent(), pode ser chamado em qualquer método da activity, vai depender da sua necessidade, mas é comumente utilizada no onCreate();

vou colocar um exemplo (obs: não vou conseguir testar o código, mas vai da pra descrever a ideia por trás) onde minha activity A chama activity B passando Pessoa como parametro, e minha activity B vai executar o oncreate e logo depois chamar o método que finaliza e manda para A o msm objeto recebido (pode ser qualquer obj, ou até msm o mesmo alterado). assim no método onActivityResult() da activity A vai ter acesso a esse obj enviado por B.

public class A extends AppCompatActivity {

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

    private void configuraBotaoSelecao() {
        Button botaoSelecao = findViewById(R.id.activity_formulario_botao);
        botaoSelecao.setOnClickListener(view -> abrirFormulario());
    }
    private void abrirFormulario() {
        Intent intent = new Intent(this, B.class);
        intent.putExtra("chaveDoObjeto", new Pessoa()); // Obj Pessoa precisa implementar Serializable
        startActivityForResult(intent, 1);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // fazer um check para verificar o código de requisição e o de resposta
        if (requestCode == 1) {
            if(resultCode == Activity.RESULT_OK){

    /*objeto enviado pela activity B através do método setResult(), 
    fiz um cast pro tipo (Pessoa) porque sei que vai ser esse tipo, 
    mas pode  ser qualquer obj que seja serializable. 
    Intent tem métodos para vários tipos para setar e recupera     vários tipos diferentes. */
                Pessoa pessoa= (Pessoa) data.getSerializableExtra("chaveDoObjeto"); 
            }
        }
    }
}

class B extends AppCompatActivity{
    private Pessoa pessoa;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();

        if(intent.hasExtra("chaveDoObjeto")){
            this.pessoa = (Pessoa) intent.getSerializableExtra("chaveDoObjeto");
        }
        finalizaActivity();
    }

    private void finalizaActivity(){
        Intent intent = new Intent();
        intent.putExtra("chaveDoObjeto", this.pessoa); //
        setResult(Activity.RESULT_OK,intent);
        finish();
    }
}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software