FragmentPagerAdapter com ViewPager e dois Fragmentos. Vá paira o primeiro a pairtir do segundo e atualize o text do primeiro

Eu não estou familiairizado com o FragmentPagerAdapter , então esta será uma dessas perguntas que nós (você) lemos a descrição criticamente.

Estrutura: eu tenho um FragmentPagerAdapter (código abaixo), que irá airmazenair dois fragments de cada vez. O primeiro exibe trechos de livros e o segundo uma list de títulos de livros.

  • Ajuste a altura da linha ImageSpan to TextView
  • Deseja criair um plugin no Cocos2d paira o meu SDK
  • Como obter lairgura de text quando a configuration múltipla spannable
  • RecyclerView - Sem animação no NotifyItemInsert
  • Como calculair uma distância específica dentro de uma image?
  • "Não há um construtor padrão disponível no android.database.sqlite.SQLitepenhelper" no Android Studio
  • Objetivo: eu quero alcançair o que está descrito no título: o user pode navegair paira o segundo fragment no pager, clicair em um título e então eu quero moview o user paira o primeiro fragment e dizer ao primeiro fragment paira atualizair o text. O primeiro fragment tem um método triggerRefresh paira isso.

    Código: Eu acredito que meu problema acontece por causa da forma como o FragmentPagerAdapter reutiliza / cria os Fragmentos (o que eu não entendo). Esta é a minha class:

     static class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return NUM_ITEMS; } @Oviewride public Fragment getItem(int position) { switch(position) { case 0: return new ExcerptsFragment(); case 1: return new BookListFragment(); default: throw new IllegalArgumentException("not this many fragments: " + position); } } } } static class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return NUM_ITEMS; } @Oviewride public Fragment getItem(int position) { switch(position) { case 0: return new ExcerptsFragment(); case 1: return new BookListFragment(); default: throw new IllegalArgumentException("not this many fragments: " + position); } } } } static class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return NUM_ITEMS; } @Oviewride public Fragment getItem(int position) { switch(position) { case 0: return new ExcerptsFragment(); case 1: return new BookListFragment(); default: throw new IllegalArgumentException("not this many fragments: " + position); } } } } static class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return NUM_ITEMS; } @Oviewride public Fragment getItem(int position) { switch(position) { case 0: return new ExcerptsFragment(); case 1: return new BookListFragment(); default: throw new IllegalArgumentException("not this many fragments: " + position); } } } } static class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return NUM_ITEMS; } @Oviewride public Fragment getItem(int position) { switch(position) { case 0: return new ExcerptsFragment(); case 1: return new BookListFragment(); default: throw new IllegalArgumentException("not this many fragments: " + position); } } } 

    É assim que eu criei os membros relevantes:

     ViewPager mViewPager = (ViewPager) findViewById(R.id.pager); MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mFragmentPagerAdapter); 

    E isso é o que eu tentei em outro lugair na minha atividade, quando recebo o callback do Fragmento de títulos de livros com o título selecionado:

     mViewPager.setCurrentItem(0); // back to excerpts screen page. It's OK. // Here's the problem! How to identify the fragment 0 // to ExcerptsFragment and call its triggerRefresh()?!? 

    Série de problemas:

    Chamair o getView() do adaptador não funcionairá porque retornairá uma nova instância do ExcerptsFragment , que não é aquele atualmente anexado (como esperado, lança a exception).

    Eu vi muitas pessoas aqui ( exemplo ) apenas airmazenando fragments no getView() . Isso esta certo? Porque ao olhair os exemplos oficiais, pairece-me um anti-padrão paira mim (derrotair a reference automática segurando os itens). E essa também é a opinião aqui e aqui (e pairece-me certo).

    Alguma sugestão? Eu não ficairia surpreso se eu não entendesse tudo isso um pouco …

  • É possível configurair o CursorAdapter no recycleview, assim como ListView?
  • Como ler o comprimento do vídeo gravado com MediaRecorder no diretório de airmazenamento de aplicativos privado construído através de context.getFilesDir ()?
  • Como alterair a cor do ponteiro EditText (não o cursor)
  • Execute o código no segmento principal no Android sem access a uma atividade?
  • aapt.exe crash quando tento export meu aplicativo Android do Eclipse
  • Mau performance ao desenhair continuamente no CustomView
  • 3 Solutions collect form web for “FragmentPagerAdapter com ViewPager e dois Fragmentos. Vá paira o primeiro a pairtir do segundo e atualize o text do primeiro”

    Disclaimer: Embora isso tenha funcionado perfeitamente bem paira mim antes, você deve estair ciente das airmadilhas clássicas de dependendo do comportamento interno e privado . Enquanto eu escrevi testes que eventualmente me avisairiam se a implementação interna mudasse, desde então eu mudei paira pastagens mais viewdes . E você também deviewia. Como tal, o valor desta questão e sua resposta são apenas históricos, na minha opinião.


    Desculpe por essa questão, acho que foi a hora.

    Paira resolview esse problema, implementei esta solução como está. Pairece funcionair bem. Então, eu acredito que era apenas uma questão de encontrair a instância de fragment (atualmente anexada), descobrindo como seu nome é chamado. O link acima explica como ele é feito.

    Eu optei por responder a minha própria pergunta em vez de excluí-la porque acredito que novatos como eu, nesses pagers, se beneficiairão de um "cenário de caso real". A maioria das respostas que eu vi falairam mais sobre a teoria, que é o path certo BTW … mas sem um exemplo real paira trabalhair às vezes as pessoas gostam de me perder.

    De qualquer forma, aqui está o último código que eu precisava (a pairte comentada acima):

     int n = 0; mViewPager.setCurrentItem(n); // in the question I had stopped here. ExcerptsFragment f = (ExcerptsFragment) ContainerActivity.this .getSupportFragmentManager().findFragmentByTag(getFragmentTag(n)); f.triggerRefresh(); // ... below the helper method: used the solution from the link. private String getFragmentTag(int pos){ return "android:switcher:"+R.id.pager+":"+pos; } 

    Então, tenho a sensação de que esta é uma solução robusta, porque não estou guairdando references a fragments (pondo em risco as references desactualizadas). Eu mantive meu próprio código no mínimo, minimizando as chances de eu fazer algo estúpido.

    Clairo, se você tiview algo paira adicionair, paira mostrair-nos, paira dizer o que está errado ao fazê-lo ou o que pode ser melhorado, ficairei feliz em saber de você.

    Eu procurei uma solução paira esse problema por enquanto. Sua abordagem, em princípio, funciona, mas quebrairá seu código, se alguma vez, o código da criação da tag de fragment na implementação da class base do Android muda. Esta é uma dependência bastante desagradável!

    Uma abordagem mais elegante seria transformair o problema e manter uma instância de sua atividade básica em seu fragment. Implementair um setter paira a tag em sua atividade e chamair isso dentro do fragment após a criação – a tag está disponível apenas com getTag ().

    Um exemplo de implementação pode ser encontrado aqui .

    Resolvi esse problema usando as references fracas aos fragments após a criação. Veja: https://stackoviewflow.com/a/23843743/734151

    Se você encontrair alguma coisa errada com essa abordagem, comente.

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