Eu sei que Activities
são projetados para representar uma única tela do meu aplicativo, enquanto Fragments
são projetados para serem layouts de UI reutilizáveis com lógica incorporada dentro deles.
Até pouco tempo atrás, desenvolvi um aplicativo que dizia que eles deveriam ser desenvolvidos. Criei um Activity
para representar uma tela do meu aplicativo e usei Fragments para ViewPager
or Google Maps
. Eu raramente criei uma ListFragment
ou outra interface do usuário que pode ser reutilizada várias vezes.
Recentemente me deparei com um projeto que contém apenas 2 Activities
um é um SettingsActivity
e outro é o MainActivity
. O layout do MainActivity
é preenchido com muitos fragmentos de interface do usuário ocultos em tela cheia e apenas um é mostrado. Na Activity
lógica, existem muitos FragmentTransitions
entre as diferentes telas do aplicativo.
O que eu gostei dessa abordagem é que, como o aplicativo usa um ActionBar
, ele permanece intacto e não se move com a animação de alternância de tela, que é o que acontece com a Activity
alternância. Isso dá uma sensação mais fluente a essas transições de tela.
Acho que o que estou pedindo é compartilhar sua maneira atual de desenvolvimento com relação a esse tópico. Sei que pode parecer uma pergunta baseada em opinião à primeira vista, mas a considero uma questão de design e arquitetura do Android ... opinião baseada em um.
UPDATE (01.05.2014): Após esta apresentação de Eric Burke da Square , (que devo dizer que é uma ótima apresentação com muitas ferramentas úteis para desenvolvedores de Android. E não tenho nenhuma relação com Square)
http://www.infoq.com/presentations/Android-Design/
De minha experiência pessoal nos últimos meses, descobri que a melhor maneira de construir meus aplicativos é criar grupos de fragmentos que representam um fluxo no aplicativo e apresentam todos esses fragmentos em um Activity
. Então, basicamente, você terá o mesmo número de Activities
em seu aplicativo que o número de fluxos. Dessa forma, a barra de ação permanece intacta em todas as telas do fluxo, mas está sendo recriada na alteração de um fluxo que faz muito sentido. Como Eric Burke afirma e como eu também percebi, a filosofia de usar o mínimo Activities
possível não é aplicável a todas as situações, porque cria uma confusão no que ele chama de atividade de "Deus".
Respostas:
Os especialistas dirão: "Quando visualizar a interface do usuário, saberei se devo usar um
Activity
ou umFragment
". No começo, isso não fará sentido, mas, com o tempo, você será capaz de dizer se precisaFragment
ou não.Há uma boa prática que achei muito útil para mim. Ocorreu-me enquanto tentava explicar algo para minha filha.
Ou seja, imagine uma caixa que representa uma tela. Você pode carregar outra tela nesta caixa? Se você usar uma nova caixa, precisará copiar vários itens da 1ª caixa? Se a resposta for Sim, você deve usá-lo
Fragments
, porque a raizActivity
pode conter todos os elementos duplicados para poupar tempo ao criá-los, e você pode simplesmente substituir partes da caixa.Mas não esqueça que você sempre precisa de um contêiner de caixa (
Activity
) ou suas peças serão dispersas. Então, uma caixa com peças dentro.Tome cuidado para não usar mal a caixa. Os especialistas em Android UX aconselham (você pode encontrá-los no YouTube) quando devemos carregar outro explicitamente
Activity
, em vez de usar umFragment
(como quando lidamos com a Gaveta de Navegação que possui categorias). Depois de se sentir confortávelFragments
, você poderá assistir a todos os vídeos deles. Ainda mais, eles são materiais obrigatórios.Você pode agora olhar para sua interface do usuário e descobrir se precisa de um
Activity
ou de umFragment
? Você recebeu uma nova perspectiva? Eu acho que você fez.fonte
Minha filosofia é esta:
Crie uma atividade apenas se for absolutamente necessária. Com a pilha traseira disponibilizada para confirmar várias transações de fragmento, tento criar o mínimo possível de atividades no meu aplicativo. Além disso, a comunicação entre vários fragmentos é muito mais fácil do que o envio de dados entre as atividades.
As transições de atividades são caras, certo? Pelo menos eu acredito que sim - uma vez que a atividade antiga deve ser destruída / pausada / parada, empurrada para a pilha e, em seguida, a nova atividade deve ser criada / iniciada / retomada.
É apenas a minha filosofia desde que os fragmentos foram introduzidos.
fonte
onActivityResult()
é mais seguro e fácil do que os retornos de chamada dos fragmentos.Bem, de acordo com as palestras do Google (talvez aqui , não me lembro), você deve considerar o uso de fragmentos sempre que possível, pois isso facilita a manutenção e o controle do seu código.
No entanto, acho que, em alguns casos, pode ficar muito complexo, pois a atividade que hospeda os fragmentos precisa navegar / se comunicar entre eles.
Eu acho que você deve decidir por si mesmo o que é melhor para você. Geralmente não é tão difícil converter uma atividade em um fragmento e vice-versa.
Eu criei um post sobre esse dillema aqui , se você quiser ler mais.
fonte
Por que prefiro Fragmento a Atividade em TODOS OS CASOS.
Atividade é cara. No Fragmento, as visualizações e os estados de propriedade são separados - sempre que um fragmento estiver inserido
backstack
, suas visualizações serão destruídas. Assim, você pode empilhar muito mais fragmentos que atividade.Backstack
manipulação. ComFragmentManager
, é fácil limpar todos os fragmentos, inserir mais do que em fragmentos e etcs. Mas para Activity, será um pesadelo manipular essas coisas.Um ciclo de vida muito previsível . Contanto que a Atividade do host não seja reciclada. os fragmentos no backstack não serão reciclados. Portanto, é possível usar
FragmentManager::getFragments()
para encontrar fragmentos específicos (não incentivados).fonte
Desde o Jetpack , o aplicativo de atividade única é a arquitetura preferida. Útil especialmente com o componente de arquitetura de navegação .
fonte
fonte
Na minha opinião, não é realmente relevante. O fator chave a considerar é
O principal uso de fragmentos é criar atividades de vários painéis, o que o torna perfeito para aplicativos responsivos para Tablet / Telefone.
fonte
Não se esqueça que uma atividade é o bloco / componente do aplicativo que pode ser compartilhado e iniciado através do Intent! Portanto, cada atividade em seu aplicativo deve resolver apenas um tipo de tarefa. Se você tiver apenas uma tarefa em seu aplicativo, acho que precisará de apenas uma atividade e muitos fragmentos, se necessário. Claro que você pode reutilizar fragmentos em atividades futuras que resolvem outras tarefas. Essa abordagem será uma separação clara e lógica de tarefas. E você não precisa manter uma atividade com diferentes parâmetros de filtro de intenção para diferentes conjuntos de fragmentos. Você define tarefas no estágio de design do processo de desenvolvimento com base nos requisitos.
fonte
Há mais do que você imagina, é preciso lembrar que uma atividade lançada não destrói implicitamente a atividade de chamada. Claro, você pode configurá-lo de forma que o usuário clique em um botão para ir para uma página, inicie a atividade dessa página e destrua a atual. Isso causa muita sobrecarga. O melhor guia que posso dar é:
** Inicie uma nova atividade apenas se fizer sentido ter a atividade principal e esta aberta ao mesmo tempo (pense em várias janelas).
Um ótimo exemplo de quando faz sentido ter várias atividades é o Google Drive. A atividade principal fornece um explorador de arquivos. Quando um arquivo é aberto, uma nova atividade é iniciada para visualizar esse arquivo. Você pode pressionar o botão de aplicativos recentes, que permitirá retornar ao navegador sem fechar o documento aberto e, em seguida, talvez abrir outro documento paralelamente ao primeiro.
fonte
attach
/detach
métodos.O que eu fiz: usando menos fragmento quando possível. Infelizmente, é possível em quase todos os casos. Então, acabo com muitos fragmentos e um pouco de atividades. Algumas desvantagens que eu percebi:
ActionBar
& Menu: Quando o fragmento 2 possui um título, menu diferente,será difícil lidar com isso. Ex: ao adicionar um novo fragmento, você pode alterar o título da barra de ação, mas, quando pop-lo,
backstack
não há como restaurar o título antigo. Você pode precisar de uma barra de ferramentas em cada fragmento para este caso, mas, acredite, você gastará mais tempo.startForResult
, a atividade tem, mas o fragmento não.Minha solução para isso é usar uma atividade para quebrar um fragmento dentro. Portanto, temos barra de ação, menu
startActivityForResult
, animação, ...fonte
getSupportFragmentManager().addOnBackStackChangedListener
para adicionar um ouvinte. obtenha o fragmento atual no ouvinte e defina o título e outras coisas.A grande vantagem de uma
fragment
atividade excessiva é que, o código usado para fragmento pode ser usado para atividades diferentes. Assim, ele fornece reutilização de código no desenvolvimento de aplicativos.fonte
usar uma actividade por aplicação para fornecer base para
fragment
utilizaçãofragment
para a tela,fragments
são peso de lite , em comparação comactivites
fragmentos são reutilizáveis fragmentos são melhor adequados para a aplicação que suporta tanto telefone & pastilhafonte
Você é livre para usar um desses.
Basicamente, você deve avaliar qual é o melhor para seu aplicativo. Pense em como você gerenciará o fluxo de negócios e como armazenar / gerenciar preferências de dados.
Pense em como os Fragments armazenam dados de lixo. Ao implementar o fragmento, você tem uma raiz de atividade para preencher com fragmento (s). Portanto, se você está tentando implementar muitas atividades com muitos fragmentos, deve considerar o desempenho em seu aplicativo, porque está manipulando (fala grosseiramente) o ciclo de vida de dois contextos, lembre-se da complexidade.
Lembre-se: devo usar fragmentos? Por que não deveria?
Saudações.
fonte
Eu uso fragmentos para melhor experiência do usuário. Por exemplo, se você possui um botão e deseja executar, digamos um serviço da web ao clicar nele, anexo um fragmento à atividade pai.
Dessa forma, o usuário não precisará se mudar para outra atividade.
Em segundo lugar, prefiro os fragmentos porque você pode lidar com eles facilmente durante a rotação.
fonte
Depende do que você deseja construir realmente. Por exemplo, o
navigation drawer
usa fragmentos. As guias também são usadasfragments
. Outra boa implementação, é onde você tem umlistview
. Quando você gira o telefone e clica em uma linha, a atividade é mostrada na metade restante da tela. Pessoalmente, eu usofragments
efragment dialogs
, como é mais profissional. Além disso, eles são manuseados com mais facilidade na rotação.fonte