Estou escrevendo um aplicativo para tablets 4.0 e 4.1, para o qual não quero usar as bibliotecas de suporte (se não for necessário), mas apenas a api 4.x.
Portanto, minha plataforma de destino é muito bem definida como:> = 4.0 e <= 4.1
O aplicativo possui um layout com vários painéis (dois fragmentos, um pequeno à esquerda, um fragmento de conteúdo à direita) e uma barra de ação com guias.
Semelhante a este:
Clicar em uma guia na barra de ação altera o fragmento "externo", e o fragmento interno é um fragmento com dois fragmentos aninhados (1. pequeno fragmento de lista à esquerda, 2. fragmento de conteúdo amplo).
Agora estou me perguntando qual é a prática recomendada para substituir fragmentos e, especialmente, fragmentos aninhados. O ViewPager faz parte da biblioteca de suporte, não há alternativa 4.x nativa para esta classe. Parece estar "obsoleto" no meu sentido. - http://developer.android.com/reference/android/support/v4/view/ViewPager.html
Então eu li as notas de lançamento do Android 4.2, a respeito ChildFragmentManager
, que seria um bom ajuste, mas estou visando 4.0 e 4.1, então isso também não pode ser usado.
ChildFragmentManager
só está disponível em 4.2
- http://developer.android.com/about/versions/android-4.2.html#NestedFragments
- http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager ()
Infelizmente, quase não existem bons exemplos por aí que mostram as melhores práticas para uso de fragmentos sem a biblioteca de suporte, mesmo em todos os guias do desenvolvedor Android; e especialmente nada sobre fragmentos aninhados.
Então, eu me pergunto: simplesmente não é possível escrever aplicativos 4.1 com fragmentos aninhados sem usar a biblioteca de suporte e tudo o que vem com ela? (precisa usar FragmentActivity em vez de Fragment, etc.?) Ou qual seria a prática recomendada?
O problema que estou tendo atualmente no desenvolvimento é exatamente esta declaração:
A Android Support Library também oferece suporte a fragmentos aninhados, para que você possa implementar designs de fragmentos aninhados no Android 1.6 e superior.
Nota: Você não pode aumentar um layout em um fragmento quando esse layout inclui um
<fragment>
. Fragmentos aninhados são suportados apenas quando adicionados a um fragmento dinamicamente.
Porque eu defini os fragmentos aninhados em XML, o que aparentemente causa um erro como:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_
No momento, concluo por mim mesmo: mesmo no 4.1, quando eu nem quero ter como alvo a plataforma 2.x, os fragmentos aninhados como mostrado na imagem não são possíveis sem a biblioteca de suporte.
(Isso pode realmente ser mais uma entrada de wiki do que uma pergunta, mas talvez outra pessoa tenha gerenciado isso antes).
Atualizar:
Uma resposta útil está em: Fragment Inside Fragment
fonte
ActionBar
(desenvolvido internamente pela Samsung). Dê uma olhada mais de perto no ActionBarSherlock, ele tem as guias na ActionBar se houver espaço.Respostas:
Limitações
Portanto, o aninhamento de fragmentos dentro de outro fragmento não é possível com xml, independentemente de qual versão
FragmentManager
você usa.Portanto, você tem que adicionar fragmentos via código, isso pode parecer um problema, mas no longo prazo torna seus layouts superflexíveis.
Então, aninhando sem usar
getChildFragmentManger
? A essênciachildFragmentManager
é que ele adia o carregamento até que a transação do fragmento anterior seja concluída. E é claro que era apenas suportado naturalmente no 4.2 ou na biblioteca de suporte.Nesting without ChildManager - Solução
Solução, claro! Eu tenho feito isso há muito tempo (desde que
ViewPager
foi anunciado).Ver abaixo; Este é um
Fragment
que adia o carregamento, entãoFragment
s podem ser carregados dentro dele.É muito simples,
Handler
é uma classe realmente muito útil, efetivamente o manipulador espera por um espaço para executar no thread principal após a transação do fragmento atual terminar de confirmar (já que os fragmentos interferem na IU que eles executam no thread principal).Eu não consideraria isso uma 'prática recomendada', mas tenho aplicativos ativos usando esse hack e ainda não tive nenhum problema com ele.
Eu também uso este método para incorporar pagers de visualização - https://gist.github.com/chrisjenx/3405429
fonte
fragment
elemento, substitui a superimplementação e tenta analisá-la / aumentá-la sozinho. Mas isso vai exigir muito esforço, bem fora do escopo de uma questão StackOverflow.A melhor maneira de fazer isso no pré-API 17 é não fazer nada. Tentar implementar esse comportamento vai causar problemas. No entanto, isso não quer dizer que não possa ser falsificado de forma convincente usando a API 14. atual. O que fiz foi o seguinte:
1 - veja a comunicação entre fragmentos http://developer.android.com/training/basics/fragments/communicating.html
2 - mova seu layout xml FrameLayout de seu Fragment existente para o layout Activity e oculte-o dando uma altura de 0:
3 - Implementar a interface no fragmento pai
4 - Implementar a interface na atividade pai
public class YourActivity extends Activity implementa yourParentFragment.OnListener {
}
5 - Aproveite, com este método você obtém a mesma funcionalidade de fluido que com a função getChildFragmentManager () em um ambiente pré-API 17. Como você deve ter notado, o fragmento filho não é mais filho do fragmento pai, mas agora filho da atividade, isso realmente não pode ser evitado.
fonte
Tive que lidar com esse problema exato devido a uma combinação de NavigationDrawer, TabHost e ViewPager, que teve complicações com o uso da biblioteca de suporte por causa do TabHost. E então eu também tive que suportar min API do JellyBean 4.1, então usar fragmentos aninhados com getChildFragmentManager não era uma opção.
Então, meu problema pode ser destilado para ...
Minha solução foi criar a ilusão de fragmentos aninhados sem realmente aninhar fragmentos. Eu fiz isso fazendo com que a atividade principal usasse TabHost E ViewPager para gerenciar duas Visualizações irmãs, cuja visibilidade é gerenciada alternando layout_weight entre 0 e 1.
Isso efetivamente permitiu que meu falso "Fragmento Aninhado" funcionasse como uma visão independente, desde que eu gerenciei manualmente os pesos de layout relevantes.
Aqui está meu activity_main.xml:
Observe que "@ + id / pager" e "@ + id / container" são irmãos com 'android: layout_weight = "0,5"' e 'android: layout_height = "0dp"'. Isso é para que eu possa ver no visualizador para qualquer tamanho de tela. Seus pesos serão manipulados no código durante a execução, de qualquer maneira.
fonte
SO
que usarActionBar
abas com umNavigation Drawer
não é bom porque as colocará automaticamente sobre a visualização da sua gaveta. Não tenho o link para fazer o backup.Com base na resposta de @Christ.Jenkins, esta é a solução que tem funcionado bem para mim, para remover fragmento (s) durante os eventos do ciclo de vida (que têm a tendência de lançar IllegalStateExceptions). Isso usa uma combinação da abordagem Handler e uma verificação Activity.isFinishing () (caso contrário, ele lançará um erro para "Não é possível executar esta ação após onSaveInstanceState).
Uso:
fonte
Embora o OP possa ter circunstâncias especiais que o impeçam de usar a Biblioteca de Suporte, a maioria das pessoas deve usá-la. A documentação do Android recomenda isso e tornará seu aplicativo disponível para o maior público possível.
Em minha resposta mais completa aqui , fiz um exemplo demonstrando como usar fragmentos aninhados com a biblioteca de suporte.
fonte