1
resposta

Uma nova Activity retornar a um fragment de outra Activity

Tenho uma MainActivity que faz a chamada de um fragmento denominado AccreditedNetworkFragment (código 1). Este por sua vez instancia um NetworkViewAdapter (código 2) que chama outro fragmento AccreditedNetworkRegionFragment (código 3).

No AccreditedNetworkRegionFragment possuo um formulário onde devem ser preenchidos vários spinners como Estado, Cidade, Bairro e Loja. Após preenchimento, ele realiza a chamada da Activity denominada AccreditedNetworkDetailsActivity (código 4).

DÚVIDA: gostaria que, no método de retorno (onOptionsItemSelected - código 5) fosse retornado o fragmento AccreditedNetworkRegionFragment com os spinners já preenchidos de acordo com o que foi preenchido anteriormente. Da maneira como está atualmente está sendo retornada a MainActivity. Isto não traz uma boa experiência para o usuário já que tem que entrar no fragmento e preencher todos os spinners novamente. Isto é possível?

Entendo que todos os meus fragmentos são da MainActivity e o AccreditedNetworkRegionFragment, que é o último a ser chamado, chamou uma nova Activity. Assim gostaria de retornar ao fragmento específico citado da Activity anterior.

CÓDIGO 1:

case NETWORK:
  mToolbar.setTitle(R.string.drawer_item_network);
  currentFragment = new AccreditedNetworkFragment();
  break;

CÓDIGO 2:

viewPager.setAdapter(new NetworkViewAdapter(getChildFragmentManager(), getContext()));

CÓDIGO 3:

case 1:
  return new AccreditedNetworkRegionFragment();

CÓDIGO 4:

 private void requestStores(String state, String city, String neighborhood, String branch) {
        if (!((SimpleSpinnerAdapter)stateSpinner.getSelectedItem()).getValue().isEmpty()) {
            AccreditedNetworkDetailsActivity.startActivity(getContext(), new ListStoresRequest(state, city, neighborhood, branch));
         }

CÓDIGO 5:

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
1 resposta

Rapaz, que treta

Eu acredito que dê pra fazer isso salvando o estado da MainActivity, overridando os métodos onPause() e onResume() e adicionando informações na Intent dela com getIntent().putExtra() no pause, e pegando essas informações com getIntent().getExtra() no resume, como dito por esse cara aqui do stkovrflw https://stackoverflow.com/a/19309848/10549388

um exemplo seria mais ou menos isso aqui

public class MainActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // código massa
    }

    @Override
    public void onPause() {
        String estado = "São Paulo";
        String cidade = "Pindamonhangaba";
        // ou pega as informações do fragment com os spinners
        getIntent().putExtra("endereco", new String[] {estado, cidade});
        super.onPause();
    }

    @Override
    public void onResume() {
        super.onResume();
        if(getIntent().hasExtra("endereco")) {
            String[] endereco = getIntent().getStringArrayExtra("endereco");

            // manda a array endereco pro fragment com os spinners, e faz ele posicionar os spinners de acordo
        }
    }

}

Eu só não sei ainda a melhor forma de mandar os dados do fragment pra MainActivity. Eu usaria o padrão Delegate, mas não sei se é o mais aplicável nesse caso.