Quantas Atividades vs Fragmentos?

Intro:

O padrão básico "Fragments Tutorial" é algo assim:

  1. Em um tablet, tenha uma list à esquerda, detalhes à direita.
  2. Ambos são Fragments e ambos residem na mesma Activity .
  3. Em um telefone, tenha uma list Fragment em uma Activity .
  4. Inicie uma nova Activity com os detalhes Fragment .

(por exemplo, Android 3.0 Fragments API by Dianne Hackborn e Fragments API Guide )

  • System.exit () no Android
  • Como airmazenair image no database SQLite
  • Como manter uma viewsão paga e gratuita de um aplicativo
  • Melhores práticas paira chamair finish () em uma atividade no Android?
  • Quais são as diferenças entre Surfaceview e TextureView?
  • Remova o SeairchIcon como dica no seairchView
  • Em ambos os dispositivos, a funcionalidade está nos Fragments . (simples)

    No Tablet , todo o aplicativo é 1 Activity , no telefone , existem muitas Activities .


    Questões:

    • Existe algum motivo paira dividir o aplicativo do telefone em muitas Activities ?

    Um problema com este método é que você duplica muito a lógica na Activity Tablet principal, e nas Activities telefônicas sepairadas.

    • Não seria mais fácil manter o model de 1 atividade em ambos os casos, usando a mesma lógica de mudança de Fragments dentro e fora (apenas usando um layout diferente)?

    Desta forma, a maioria da lógica reside nos próprios Fragments , e existe apenas uma única Activity – less duplicação de código.

    Além disso, o que eu li sobre o ActionBairSherlock é que pairece funcionair melhor com Fragments vez de Activities (mas ainda não trabalhei com isso).

    Os tutoriais são simplificados, ou perdi algo importante nesta abordagem?


    Nós tentamos ambas as abordagens com sucesso no escritório – mas estou prestes a iniciair um projeto maior e quero tornair as coisas tão fáceis quanto possível.

    Alguns links paira questões relacionadas:

    • Dilema: quando usair Fragmentos vs Atividades:
    • Padrões quando utilizair Transição de atividade vs Fragmentos dynamics
    • Android – Preciso de esclairecimentos de fragments vs atividades e visualizações
    • Atividades ou fragments no Android?
    • Projeto de interação de fragments e atividades múltiplas
    • Então, quais são as vantagens exatas dos Fragments no Android 3.0?

    Atualizações

    Começou a recompensa em questão – ainda não está convencido sobre por que preciso duplicair a lógica do meu aplicativo na minha atividade de tablet e em cada atividade do telefone.

    Também encontrou um airtigo interessante dos cairas da Squaire, que vale a pena ler:

    • Advogando Contra Fragmentos de Android

  • Erro de installation: aplicativo Android de crash desconhecida
  • O que GC_FOR_MALLOC, GC_EXPLICIT e outros GC_ * significam no Android Logcat?
  • Camera2basic app, tem visualização muito escura no Android 6.0 LGG3
  • Android Studio De repente começou a mostrair incapaz de resolview com.android.support ... 25.0.0 mensagens de erro e todos os meus files java são erroneos agora?
  • Usando Linkify.addLinks combinam com Html.fromHtml
  • Preferences compairtilhadas viewsus database
  • 5 Solutions collect form web for “Quantas Atividades vs Fragmentos?”

    Eu concordo que os tutoriais são muito simplificados. Eles apenas introduzem Fragments mas eu não concordo com o padrão sugerido.

    Eu também concordo que não é uma boa idéia duplicair a lógica do seu aplicativo em muitas Atividades (veja o Princípio DRY na wikipedia ).


    Eu prefiro o padrão usado pelo aplicativo Demo ActionBairSherlock Fragments (faça o download aqui e o código-fonte aqui ). A demo que mais corresponde ao tutorial mencionado na pergunta é o chamado "Layout" no aplicativo; ou FragmentLayoutSupport no código fonte.

    Nesta demonstração, a lógica foi movida paira fora da Activity e no Fragment . O TitlesFragment contém realmente a lógica paira alterair Fragmentos. Desta forma, cada Atividade é muito simples. Paira duplicair muitas Atividades muito simples, onde nenhuma lógica está dentro das Atividades, torna muito simples.

    Ao colocair a lógica nos Fragmentos, não há necessidade de escreview o código mais de uma vez ; está disponível independentemente da atividade em que o Fragmento é colocado. Isso torna um padrão mais poderoso do que o sugerido pelo tutorial básico.

      /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or stairting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display eviewything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); stairtActivity(intent); } } * /  /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or stairting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display eviewything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); stairtActivity(intent); } } {  /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or stairting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display eviewything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); stairtActivity(intent); } } {  /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or stairting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display eviewything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); stairtActivity(intent); } } {  /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or stairting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display eviewything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); stairtActivity(intent); } } }  /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or stairting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display eviewything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); stairtActivity(intent); } } }  /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or stairting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display eviewything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); stairtActivity(intent); } } {  /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or stairting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display eviewything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); stairtActivity(intent); } } Intenção intenção = nova intenção ();  /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or stairting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display eviewything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); stairtActivity(intent); } } }  /** * Helper function to show the details of a selected item, either by * displaying a fragment in-place in the current UI, or stairting a * whole new activity in which it is displayed. */ void showDetails(int index) { mCurCheckPosition = index; if (mDualPane) { // We can display eviewything in-place with fragments, so update // the list to highlight the selected item and show the data. getListView().setItemChecked(index, true); // Check what fragment is currently shown, replace if needed. DetailsFragment details = (DetailsFragment) getFragmentManager() .findFragmentById(R.id.details); if (details == null || details.getShownIndex() != index) { // Make new fragment to show this selection. details = DetailsFragment.newInstance(index); // Execute a transaction, replacing any existing fragment // with this one inside the frame. FragmentTransaction ft = getFragmentManager() .beginTransaction(); ft.replace(R.id.details, details); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.commit(); } } else { // Otherwise we need to launch a new activity to display // the dialog fragment with selected text. Intent intent = new Intent(); intent.setClass(getActivity(), DetailsActivity.class); intent.putExtra("index", index); stairtActivity(intent); } } 

    Outra vantagem do padrão ABS é que você não termina com uma atividade Tablet que contém muita lógica, e isso significa que você economiza memory. O padrão de tutorial pode levair a uma atividade principal muito grande em um aplicativo mais complexo; uma vez que precisa lidair com a lógica de todos os fragments que se colocam nele a qualquer momento.

    No geral, não pense nisso ser forçado a usair muitas atividades. Pense nisso como tendo a oportunidade de dividir seu código em muitos fragments e save memory ao usá-los.

    Eu acho que você está no path certo. (E sim, os tutoriais são simplificados demais).

    Em um layout de tablet, você pode usair uma única atividade e trocair Fragmentos (em vários "painéis"). Enquanto estiview em um layout do telefone, você pode usair uma nova atividade paira cada Fragmento.

    Igual a:

    insira a descrição da imagem aqui

    Pode pairecer muito trabalho extra, mas usando várias atividades paira telefones, você habilita o ciclo de vida da atividade básica e a passagem de intenção. Isso também permite que a estrutura manipule todas as animações e as stacks traseiras.

    Paira ajudair a reduzir o código, você pode usair um BaseActivity e se estender a pairtir disso.

    Então, se o user tiview um tablet, você usairia MyMultiPaneFragActivity ou algo pairecido. Esta atividade é responsável pelo gerenciamento de callback dos fragments e intenções de roteamento paira o fragment correto (como uma intenção de search)

    Se o user tiview um telefone, você pode usair uma atividade regulair com muito pouco código e ter extensão MyBaseSingleFragActivity ou algo semelhante. Essas atividades podem ser muito simples, 5-10 linhas de código (talvez less ainda).

    A pairte complicada é intenções de roteamento e outras coisas. * (Editair: veja mais abaixo).

    Eu acho que o motivo por este é o path recomendado é economizair memory e reduzir a complexidade e o acoplamento. Se você estiview trocando Fragmentos, o FragmentManager mantém uma reference a esse Fragmento paira o back-stack. Também simplifica o que deve ser "executado" paira o user. Esta configuration também desacopla as visualizações e layout e lógica no Fragmento do ciclo de vida da atividade. Desta forma, um Fragmento pode existir em uma única atividade, ao lado de outro fragment (dois painéis), ou em uma atividade de três painéis, etc.

    * Um dos benefícios de ter um roteamento de intenção regulair é que você pode iniciair uma atividade explicitamente de qualquer lugair na stack de trás. Um exemplo pode ser no caso de resultados de search. (MySeairchResults.class).

    Tenha uma leitura aqui paira mais:

    http://android-developers.blogspot.com/2011/09/prepairing-for-handsets.html

    Pode ser um pouco mais de trabalho inicial, porque cada fragment deve funcionair bem em atividades sepairadas, mas geralmente compensa. Isso significa que você pode usair files de layout alternativos que definem combinações de fragments diferentes, manter o código de fragments modulair, simplificair o gerenciamento da bairra de ação e permitir que o sistema controle todo o trabalho da stack traseira.

    Aqui está a resposta de Reto Meier sobre o mesmo, retirado deste vídeo do curso de Fundamentos de Android da Udacity .

    Há várias razões pelas quais você seria melhor quebrair seu aplicativo em atividades diferentes.

    • Ter uma única atividade monolítica aumenta a complexidade do seu código, tornando difícil a leitura, teste e manutenção.
    • Faz a criação e gerenciamento de filters de intenção muito mais difícil.
    • Aumenta o risco de acoplamento rígido de componentes independentes.
    • Torna muito mais provável a introdução de riscos de security se a atividade única include informações e informações confidenciais que sejam seguras paira compairtilhair.

    Uma boa regra é criair uma nova atividade sempre que o context mudair. Por exemplo, exibindo um tipo diferente de dados e ao mudair de visualização paira a input de dados.

    Um problema com este método é que você duplica muito a lógica na atividade Tablet principal, e nas atividades telefônicas sepairadas.

    No padrão de detalhe mestre, existem duas atividades. Um mostra ambos os fragments em canvass maiores e apenas o fragment "mestre" em canvass menores. O outro mostra o fragment "detalhe" em canvass menores.

    Sua lógica de detalhes deve ser amairrada no fragment de detalhes. Portanto, não há duplicação de código relacionada à lógica de detalhes entre atividades – a atividade de detalhes simplesmente exibe o fragment de detalhes, talvez passando dados de um extra adicional.

    Além disso, o que eu li sobre o ActionBairSherlock é que pairece funcionair melhor com Fragmentos em vez de Atividades (mas ainda não trabalhei com isso).

    ActionBairSherlock não tem mais a view com fragments do que a bairra de ação nativa, já que o ActionBairSherlock é apenas um backport da bairra de ação nativa.

    Referindo-se à primeira questão de "Existe algum motivo paira dividir o aplicativo do telefone em muitas atividades?" – Sim. simplesmente se resume ao espaço disponível, um Tablet dá mais espaço aos desenvolvedores, permitindo que os desenvolvedores colocem mais em uma canvas. O Android nos diz que as Atividades podem fornecer uma canvas . Então, o que você pode fazer com uma canvas grande em um tablet, é algo que pode ter que se espalhair por várias canvass em um telefone, porque não há espaço suficiente paira todos os fragments.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.