Fragmento ou Fragmento de Suporte?

125

Estou desenvolvendo um aplicativo que suporta Android> = 4.0. Ele usa fragmentos da android.appembalagem. Como estou enfrentando problemas com a implementação de fragmentos mais antiga na 4.0, como esta , que já foram corrigidos na biblioteca de suporte, estou pensando em voltar à implementação de fragmentos da biblioteca de suporte para obter uma implementação mais confiável e consistente.

Qual a sua opinião sobre isso? Você está usando fragmentos da biblioteca de suporte, mesmo que já estejam disponíveis, ao desenvolver para o Android 4?

brillenheini
fonte
2
Essa é uma boa pergunta (+1 porque me deixa curiosa). Também não há uma boa explicação na web para isso. Estou usando a biblioteca de suporte do meu aplicativo e me pergunto se estou errado ou não, porque não notei nenhum erro durante a compilação ou durante o teste.
JJ86
2
@animuson A resposta de brillenheini prova que essa não é uma resposta primariamente baseada em opiniões.
OneWorld 16/01

Respostas:

90

Pela minha experiência, usar a mesma implementação de fragmento em todos os dispositivos Android é uma grande vantagem. Não consegui me livrar de todas as NullPointerExceptions quando o estado é salvo no Android 4.0 usando fragmentos nativos, com a biblioteca de suporte em que desapareceram. Também não pude ver nenhuma desvantagem até agora com essa abordagem.

Portanto, minha resposta para minha própria pergunta é agora: ao desenvolver para o Android 4.x, usar os fragmentos da biblioteca de suporte é uma boa idéia. A biblioteca de suporte possui bugs corrigidos que ainda estão presentes nas implementações de fragmentos mais antigos e é frequentemente atualizado com mais correções.

brillenheini
fonte
11
Então, qual é o propósito do android.app.Fragmententão? Se você puder adicionar isso à sua resposta aqui com um pouco mais de explicação, eu ficaria totalmente satisfeito. Obrigado!
jonstaff
1
@ jonstaff O motivo é provavelmente histórico. Por favor, veja minha resposta atualizada lá.
Brillenheini
11
Por uma questão de integridade, parece haver coisas que os fragmentos de suporte não podem fazer (por exemplo, serem animadosobjectAnimator , mesmo que o SO de destino real o suporte). O que, no caso de você estar usando ViewPager, significa que você precisa usar adaptadores da biblioteca de suporte da v13, caso contrário, não poderá ter o viewpager e a animação invertida.
GSerg
5
Além disso, tenha cuidado, desde agosto de 2014, a biblioteca v13 não pode fazer fragmentos aninhados.
Martin Marconcini
1
Por que os caras do google optaram por usar a biblioteca v13 do aplicativo iosched github.com/google/iosched/blob/master/android/src/main/java/com/… , eles devem ter algum motivo
forcewill
40

Um grande motivo para permanecer SupportFragmentpor um tempo é que você não tem acesso ChildFragmentManageraté a API 17. A biblioteca de suporte fornecerá uma versão de suporte do gerenciador de fragmentos filho.

Isso se torna um grande problema se você tiver fragmentos que contenham outros fragmentos. Isso é comum em aplicativos de tablet com muita complexidade e / ou sua arquitetura geral se baseia em um layout com guias ou usa a gaveta de navegação.

Ross Hambrick
fonte
21

Eu também estava ficando frustrado por ter que incluir as bibliotecas de suporte, apesar de ter como alvo o Android 4.0 ou superior - mas parece que é oficialmente recomendado:

O pacote Android Support Library contém várias bibliotecas que podem ser incluídas no seu aplicativo. Cada uma dessas bibliotecas suporta um intervalo específico de versões da plataforma Android e um conjunto de recursos.

Este guia explica os recursos importantes e o suporte à versão fornecido pelas Bibliotecas de suporte para ajudá-lo a decidir quais delas você deve incluir em seu aplicativo. Em geral, recomendamos a inclusão das bibliotecas de suporte v4 e v7 appcompat, pois elas oferecem suporte a uma ampla variedade de versões do Android e fornecem APIs para os padrões de interface do usuário recomendados.

http://developer.android.com/tools/support-library/features.html

sourabhj
fonte
Essa deve ser a resposta aceita, apesar de o @brillenheini ter fornecido uma resposta por conta própria. Responde à pergunta com a melhor precisão e concisão.
Arvindh Mani
4

IMHO, se você planeja desenvolver apenas para 4.0, eu recomendaria ir com as bibliotecas nativas, pois o executável ficará menor. É verdade que você pode ter problemas de bugs nas versões anteriores, mas acho que a maioria delas deve ser bastante trivial para contornar. Além disso, a biblioteca de compatibilidade deve mapear para os fragmentos nativos, caso você esteja executando o 4.0 e superior. Portanto, você pode acabar tendo que enfrentar esse tipo de problema de qualquer maneira. O problema com as bibliotecas de suporte é que muitas classes aparecem 2x (uma vez na estrutura do pacote de suporte e outra na estrutura do pacote "nativo"), o que torna o desenvolvimento um pouco mais complicado.

No entanto, se você também deseja lançar seu aplicativo antes da 4.0, não há como contornar a biblioteca de suporte. Além disso, como existem cerca de 38% de todos os usuários no 2.3, pode fazer sentido para os negócios incluir essa versão do sistema operacional. Nesse caso, você pode usar a biblioteca de suporte em conjunto com o Jake Wartons ActionBarSherlock (ou com o Google suporta a biblioteca ActionBar depois que ela for lançada).

RaB
fonte
3
Obrigado pela sua resposta. Como preciso do ViewPager, tenho que incluir a biblioteca de suporte de qualquer maneira. Além disso, o fragmento de suporte não tenta alternar para a implementação nativa, se disponível. É o que dizem os médicos .
Brillenheini 26/06
Sim, a coisa é (como a @brillenheini disse) que, para ter o ViewPager, você precisa da v4, portanto, mesmo se você estiver segmentando apenas dispositivos v13 +, provavelmente terminará a v4.
Sotti 19/05
Acabei de descobrir isso também (o ViewPager precisa da v4) na minha API 21 e no aplicativo. Meh: - /
mraviator
2

Parece que é melhor usar a Biblioteca de suporte agora porque vi a declaração aqui https://developer.android.com/reference/android/app/Fragment.html

Esta classe foi descontinuada no nível de API P. Use o Fragmento da Biblioteca de Suporte para obter um comportamento consistente em todos os dispositivos e acessar o Ciclo de Vida.

code4j
fonte