Galera,
Eu tenho um fragmento A, no qual quando clico em um botão ele chama um Fragment B no lugar desse fragment A, e o B chama o fragment C.
Como eu faço para quando clicar no botão de voltar, ao invés dele matar a Activity, ele ir voltando para o fragment B, depois o A.
Tentei desse modo, mas não deu certo:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.conteudo, sc);
ft.addToBackStack(null);
ft.commit();
Alguém sabe me ajudar? Obrigado.
sobrescreve o onBackPressed, coloque alguma condição para qndo apertar voltar o fragmente e outra para realmente sair de fato (ex: quando apetar back e se o fragment atual for o A, então ele sai da aplicação)
[code]@Override
public void onBackPressed() {
}[/code]
Hum, pode ser que nesse caso dê pra fazer algo desse tipo, porém, tenho um outro problema.
Em uma outra tela, tenho um fragment com um Grid com vários elementos, quando clicado, busca informações no banco e popula novamente o mesmo grid, e assim vai indo, pode ser que sejam 10 telas uma sobre a outra…
Ai eu te pergunto, nesse caso, tem como eu salvar os estados de todas as telas, para caso chegando na 10ª eu ir voltando uma por uma.
Não entendi…
essas 10 telas são fragments no Grid(cada item do grid) ou 10 fragments sobre o fragment do grid (como pilha de activities)?
é 1 fragment só que contém somente 1 grid.
Esse grid é preenchido dinamicamente de acordo com o que vier do banco. Ou seja, eu tenho o grid com 5 elementos por exemplo(que vieram de um select) se eu clicar no primeiro elemento, ele executa um novo select passando o id desse primeiro elemento na cláusula WHERE. Com o retorno desse novo select eu preencho novamente meu grid com essas novas informações, podendo ter somente 2 elementos dessa vez. E assim vai indo, até uma hora o retorno do select vai acabar.
Só que eu preciso saber, qual era o estado do meu grid anterior, pois o usuário poderá voltar em outro elemento se quiser.
Assim, tenho que armazenar todos os estados da minha grid.
Alguma ideia?
Vai criando e armazenando os adapter.
Clicou, armazena o atual adapter em uma pilha e manda criar um novo(com os novos dados) e da outro .setAdapter.
no back da um .poll da pilha e da outro .setAdapter
Hum deve funcionar! Só tem um problema, como armazeno os adapter em uma pilha? haha
private Stack<BaseAdapter> stack = new Stack<BaseAdapter>();
private MyAdapter adapter;
//primeiro adapter
adapter = new MyAdapter;
gridView.setAdapter(adapter);
//novo adapter
Myadapter tempAdapter = new MyAdapter();
stack.push(adapter);
adapter = tempAdapter;
gridView.setAdapter(adapter);
@Override
public void onBackPressed() {
if(!stack.isEmpyt()){
gridView.setAdapter(stack.pop());
}else{
}
Olá
Faz assim, quando chamar o FragB:
Fragment fragB = new FragmentB();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.conteudo, fragB);
transaction.addToBackStack(null);
transaction.commit();
Quando chamar o FragC:
Fragment fragC = new FragmentC();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.conteudo, fragC);
transaction.addToBackStack(null);
transaction.commit();
Se for o mesmo fragment, com dados diferentes é só instanciar um novo FragmentX e passar os dados, fazendo do mesmo jeito que acima.
Tentei aqui mas ainda não deu certo. Estou fazendo assim:
dentro do OnCreateView eu chamo o método carregaPerguntas:
ImageAdapterPergunta adapter = new ImageAdapterPergunta(getActivity(), voListPerguntas);
gridView.setAdapter(adapter);
stack.push(adapter);
No onItemClickListener da grid… eu chamo novamente esse método, cada vez que entra nesse método eu instancio novamente um ImageAdapterPergunta, e é jogado para a pilha. Até ai beleza, sem problemas.
Ai no método de voltar, eu faço:
if(!stack.isEmpty()){
gridView.setAdapter(stack.pop());
}
Só que minha Grid não atualiza com o novo adapter, já tentei utilizar notifyDataSetChanged e InvalidateView e nada acontece.
Fica mais fácil usar somente os recursos dos Fragments.
Você só precisa instanciar um novo fragment, no fragment você carrega os dados e mostra normal. O fragment não precisa saber de mais nada é só instanciar, e dar replace o resto o back-stack toma conta! Isso é automático da API, testa aí
Hum a ideia é boa, estou tentando aqui, só tem um porém, como eu faço para ele ir retirando os fragments da pilha e abrindo o anterior?
Pq vc falou pra mim dar replace nao é? mesmo se for add, tentei aqui… quando volto, ele mata a activity e não vai voltando de fragment em fragment.
Vai apertando o back, ele vai fazendo o trabalho sozinho!
Só precisa dar o replace no fragment e o add no backStack
Não precisa de nenhum código no onBackPressed
quando aperto back ele mata a activity que está o fragment e volta pra activity anterior.
Viu a atualizada que dei no post acima
não da…
estou tentando usar o método manager.popBackStack(), foi o melhor que consegui até agora… ele até vai me mostrando os fragments anteriores… único problema que não consegui resolver ainda é que na primeira vez que vc tenta utilizar ele, tem que clicar 2 vezes… como se tivesse adicionado 2 vezes o mesmo fragment, não sei, nas outras navegam normal até chegar na primeira tbm, que não é exibida!!
Do jeito que vc falou Gusukuma, o Back mata a activity!
Vlw, vou continuar tentando aqui.
O seu Fragment tem um construtor vazio?
não. Mas tem um construtor que recebe um argumento, já que a cada chamada do novo Fragment tenho q passar esse parâmetro para ele, para ele buscar as informações a partir dai.
No else voce pode super.obBackPressed() que é a condição que não precisa mais voltar e voce pode deixar a Activity lidar com isso.
É … o problema mesmo é que não está sendo armazenado o primeiro fragment, e o último ele armazena 2 vezes, ou pelo menos tem que clicar 2 vezes em voltar pra ele mudar de fragment, ai os outros vão normal, até o penúltimo, já que o último não abre. =/