Voltar para Fragment anterior usando Tabs na ActionBar

764 views
Skip to first unread message

Derci Santos

unread,
May 25, 2012, 3:59:34 PM5/25/12
to androidb...@googlegroups.com, android-bra...@googlegroups.com
Boa tarde galera,

Estou com um problema que parece ser simples... mas que não estou conseguindo resolver de forma alguma... 

A explicação do problema está no link: http://www.portalandroid.org/comunidade/viewtopic.php?f=5&t=19672

Desde já agradeço pela atenção.

--
Att,
Derci Santos
Skype: dercilima


Recomendação se for reenviar esta mensagem, por favor:

1. Apague o MEU endereço eletrônico e todos os outros constantes do e-mail;
2. Encaminhe como CÓPIA OCULTA (Cco ou Bcc) aos seus destinatários.
3. Agindo desta forma, você estará colaborando para dificultar a disseminação de vírus e spams, e também para tornar a internet mais segura.

luciofm

unread,
May 25, 2012, 4:09:47 PM5/25/12
to androidb...@googlegroups.com
Percebe que estás fazendo um commit vazio, e tentando adicionar para a backstack?

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

// Adiciona na BackStack e commita
ft.addToBackStack("frag");
ft.commit();

Lúcio Maciel
luc...@gmail.com


2012/5/25 Derci Santos <dercii...@gmail.com>

Derci Santos

unread,
May 25, 2012, 4:27:12 PM5/25/12
to androidb...@googlegroups.com
Boa tarde Lúcio,

Quando eu não uso abas eu faço da seguinte forma:

FrgClientesDetalhes frgCliDetalhes = new FrgClientesDetalhes();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.lcontainer, frgCliDetalhes, "frgCliDetalhes");
ft.addToBackStack("frag");
ft.commit();

e funciona normalmente, porém se eu usar as abas da action bar, e deixar a linha: ft.replace(R.id.lcontainer, frgCliDetalhes, "frgCliDetalhes"); o android me apresenta o seguinte erro:

Fragment already added: FrgClientesDetalhes{4083f850 id=0x7f0600b5 frgCliDetalhes}

O que eu posso fazer nesse caso, pra que eu consiga salvar a backstack e usar as abas da actionBar?

luciofm

unread,
May 25, 2012, 4:44:43 PM5/25/12
to androidb...@googlegroups.com

public abstract void onTabUnselected (ActionBar.Tab tab, FragmentTransaction ft)

Since: API Level 11

Called when a tab exits the selected state.

Parameters
tabThe tab that was unselected
ftFragmentTransaction for queuing fragment operations to execute during a tab switch. This tab's unselect and the newly selected tab's select will be executed in a single transaction. This FragmentTransaction does not support being added to the back stack.

Em negrito.

Lúcio Maciel
luc...@gmail.com


2012/5/25 Derci Santos <dercii...@gmail.com>
Boa tarde Lúcio,

Derci Santos

unread,
May 25, 2012, 5:08:20 PM5/25/12
to androidb...@googlegroups.com
Então... já que não é possível usando a backstack ... o que eu poderia fazer nesse caso?

Já tentei pegar ação do botão voltar seguindo o tópico: http://stackoverflow.com/questions/7992216/android-fragment-handle-back-button-press

mas fiz um debug e nem passa pelo método, parece que ele não reconhece o método.

Jonas Alves

unread,
May 25, 2012, 7:46:34 PM5/25/12
to androidb...@googlegroups.com

Deixa eu ver se entendi... Você quer que o botão voltar volte para a aba anterior?
Se sim, pare por aí. Mudança de abas não devem entrar no backStack.

Jonas Alves

unread,
May 25, 2012, 7:51:13 PM5/25/12
to androidb...@googlegroups.com

Adicionando, a documentação do Android é clara sobre isso:

Changing view within a screen
Changing view options for a screen *does not change the behavior of Up or Back*: the screen is still in the same place within the app's hierarchy, and no new navigation history is created.
Examples of such view changes are:
- Switching views using tabs and/or left-and-right swipes
...

Fonte: http://developer.android.com/design/patterns/navigation.html

Gink Labrev

unread,
May 25, 2012, 7:56:21 PM5/25/12
to androidb...@googlegroups.com
Cara, uma app que usa backstack em abas é o Instagram, apesar de parecer um componente personalizado.

Acho que não tem jeito. Se quiser uma aba que possa voltar, terá que criar seu próprio componente.

Jonas Alves

unread,
May 25, 2012, 8:01:33 PM5/25/12
to androidb...@googlegroups.com

Insisto, não se DEVE fazer isso.

Gink Labrev

unread,
May 25, 2012, 8:23:42 PM5/25/12
to androidb...@googlegroups.com
Cara,

Até concordo. Gosto de simplicidade.

Como regra geral, não se deve fazer isso. Mas o Instagram usa e funciona bem. Então ... depende de cada caso.

Gink Labrev

unread,
May 25, 2012, 8:27:56 PM5/25/12
to androidb...@googlegroups.com
Eu msm já desenvolvi um TabGroup customizado com este efeito.

Digo que não é trivial, sempre que o usuário clica em uma aba já adicionada ao fragment, deve-se pesquisar se já existe no backstack e removê-la, sob o risco de ficar cíclico e sem sentido. Tem que gerenciar a esmero os fragments.

Por isso, não recomendo. Dá maior trabalhão que pode ser melhor investido em outras funcionalidades.

Mas se tem tempo e recursos de sobra e já sabe que isso é indispensável ao usuário, então manda ver.

luciofm

unread,
May 26, 2012, 8:44:38 AM5/26/12
to androidb...@googlegroups.com
EU acho péssimo isso no Instagram... eu nunca sei quando vou sair da aplicação, pois ele salva o backstack de tabs...


Lúcio Maciel
luc...@gmail.com


2012/5/25 Gink Labrev <gink....@gmail.com>

Maicon Strey

unread,
May 26, 2012, 10:21:12 AM5/26/12
to androidb...@googlegroups.com
Concordo com o Lucio.

Maicon Strey
Novo Hamburgo - RS - Brasil
------------------
http://maicon.strey.nom.br/blog/ 
http://maicon.strey.nom.br/blog/netiqueta/ 
Linux user: #525086
------------------



2012/5/26 luciofm <luc...@gmail.com>

Derci Santos

unread,
May 28, 2012, 7:26:42 AM5/28/12
to androidb...@googlegroups.com
Bom dia galera,

Desculpa a demora em responder... 

Acho que teve um pequeno engano no momento de fazer a explicação... O que ocorre é o seguinte, não quero usar o botão voltar para ficar alternando as abas, o que preciso é o seguinte... tenho um fragment que é uma lista de clientes, quando eu clico em um item da lista chamo outros dois fragments que são duas abas (Detalhes e Financeiro). O usuário pode navegar a vontade entre as duas abas, porém quando ele clicar no botão voltar, deve voltar para a lista de clientes. Mas o que está acontecendo é o seguinte, quando clica no botão voltar uma vez nada acontece, quando clica duas vezes ele fecha a app, lembrando que quando estou na lista de clientes e clicar no botão voltar ele tem que fechar a app mesmo.

Segue o código da ação do clique na lista e de como as abas são montadas:

Maicon Strey

unread,
May 28, 2012, 7:49:39 AM5/28/12
to androidb...@googlegroups.com
Tu não deves implementar um botão pra fechar a app. se o usuario quiser fechar ele vai pressionar o botão voltar do próprio android.

tu não precisa deste botão. tu estas pensando em desenvolvimento pra desktop ou iphone e android é diferente.

Se tu fizer isso só precisa controlar o empilhamento das acitivitys.


Maicon Strey
Novo Hamburgo - RS - Brasil
------------------
http://maicon.strey.nom.br/blog/ 
http://maicon.strey.nom.br/blog/netiqueta/ 
Linux user: #525086
------------------



2012/5/28 Derci Santos <dercii...@gmail.com>

Derci Santos

unread,
May 28, 2012, 8:01:14 AM5/28/12
to androidb...@googlegroups.com
Bom dia Maicon,

Você num entendeu... quando o usuário clica no botão voltar na primeira activity ele fecha o sistema mesmo, pois não tem nada mais sobre a pilha de activities... agora, quando eu chamo as abas com os dois fragments eu preciso que ele volte a tela anterior, mas isso na acontece. 

Maicon Strey

unread,
May 28, 2012, 8:14:10 AM5/28/12
to androidb...@googlegroups.com
Derci,
Você que não está entendendo.
Quando o usuário pressionar o botão voltar do Android a activity será fechada. não existe necessidade de um botão na tela pra fazer isso.
O mesmo vale para as abas. como você mesmo disse: "...preciso que ele volte a tela anterior". basta empilhar as telas que ao pressionar o botão voltar do próprio android a tela atual será fechada e voltará pra tela anterior.

Ao tu não estas conseguindo descrever corretamente o que você precisa. Mas se o que você precisa é só voltar pra tela anterior não existe a necessidade de colocar um botão na tela pra fazer isso.

Maicon Strey
Novo Hamburgo - RS - Brasil
------------------
http://maicon.strey.nom.br/blog/ 
http://maicon.strey.nom.br/blog/netiqueta/ 
Linux user: #525086
------------------



2012/5/28 Derci Santos <dercii...@gmail.com>
Bom dia Maicon,

Derci Santos

unread,
May 28, 2012, 8:23:52 AM5/28/12
to androidb...@googlegroups.com
Então, 

Não estou criando um botão voltar... o botão voltar é o do android mesmo... 

Você viu o código que eu passei?? Nele da pra ver melhor o que estou falando... 

Eu adiciono a transação na backstack com o addToBackStack mas o android não volta para o fragment anterior... 

Dai surgiu a ideia de pegar a action do botão voltar no fragment e chamar o fragment anterior. Já que a opção de adicionar na backstack não deu certo.

Abraços

Jonas Alves

unread,
May 28, 2012, 8:24:11 AM5/28/12
to androidb...@googlegroups.com

Se eu entendi bem, essas duas abas estão na mesma Activity que a lista.
Coloque elas em uma Activity nova.
Não recomendo colocar Fragments demais na mesma Activity. Com o tempo fica difícil de controlá-los.

Derci Santos

unread,
May 28, 2012, 8:27:38 AM5/28/12
to androidb...@googlegroups.com
Então Jonas,

Minha app tem apenas uma activity até o momento... E nessa activity, tenho um menu a esquerda da tela do tablet e a direita tenho o espaço reservado aos fragments. Dai quando preciso chamar outro fragment somente ocupo esse espaço.

Tipo... eu tenho um fragment com uma lista de cliente que chama outros dois fragments, um com os detalhes e outro com o financeiro do cliente.


--
Att,
Derci Santos
Skype: dercilima
Fones: (34) 8434 - 7699 (Claro)
           (34) 3255 - 7487 (Fixo CTBC)
           (64) 9238 - 2325 (Claro)

Derci Santos

unread,
May 28, 2012, 9:36:16 AM5/28/12
to androidb...@googlegroups.com
Bom dia Galera,

Resolvi fazer diferente do que estava fazendo. Ao invés de eu chamar os fragments, chamei uma activity que vai gerenciar as abas com os dois fragments, dai da certo. Nem precisa adicionar na backstack nem pegar ação do botão voltar, o próprio android já trata isso.

Obrigado a todos ... Abraços


--
Att,
Derci Santos
Skype: dercilima
Reply all
Reply to author
Forward
0 new messages