Eu tenho uma interface de fragmento com guias na parte inferior que abrem diferentes fragmentos na visualização principal.
Eu tenho um fragmento específico que é uma lista de itens. Se o usuário selecionar um dos itens nesta lista, outro fragmento é aberto, contendo um visualizador que rola horizontalmente entre todos os itens da lista do fragmento anterior. Isso funciona muito bem.
O viewpager usa um FragmentPagerAdapter para exibir os itens.
O problema surge quando o usuário seleciona um item da lista, visualiza-o e, em seguida, clica no botão na barra de guias para voltar à lista e seleciona outro item. Na segunda vez que um item é selecionado, uma tela em branco aparece em vez do viewpager. Não recebo erros no meu LogCat quando isso acontece.
Por que o viewpager está aparecendo apenas na primeira vez?
FragmentPagerAdapter:
public class ViewPagerAdapter extends FragmentPagerAdapter {
Cursor mCursor;
public ViewPagerAdapter(FragmentManager fm, Cursor c) {
super(fm);
mCursor = c;
}
public void changeCursor(Cursor c) {
mCursor = c;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
if (mCursor == null) return 0;
else return mCursor.getCount();
}
@Override
public Fragment getItem(int position) {
mCursor.moveToPosition(position);
return TeamCardFragment.newInstance(mCursor, position);
}
}
PagerFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle bundle = getArguments();
mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);
View mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
new setAdapterTask().execute();
return mView;
}
private class setAdapterTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void result) {
mViewPager.setAdapter(mAdapter);
mViewPager.setCurrentItem(mCursorPosition);
}
}
FragmentPagerAdapter
eFragmentStatePagerAdapter
está no primeiro sendo mais adequado para poucas páginas, ele retém todos os fragmentos na memória, portanto, tendo melhores desempenhos na troca de página, enquanto o último é mais adequado para muitos páginas, ele destrói fragmentos, mantendo apenas seu estado, é mais eficiente em termos de memória, mas um pouco mais lento na troca de página.Consegui resolver isso substituindo
getFragmentManager()
porgetChildFragmentManager()
no fragmento pai. Este fragmento pai instanciava um android.support.v4.app.FragmentPagerAdapter para conter fragmentos pagináveis (deslizáveis), o que requer um gerenciador de fragmentos no construtor. Para esse construtor, passei o valor de retorno degetChildFragmentManager()
.O link do hackbod era a chave ( https://developer.android.com/about/versions/android-4.2.html#NestedFragments ), que foi encontrado nesta postagem Fragments within Fragments
fonte
FragmentStatePagerAdapter
não resolve a questão aqui formulada. junto com oFragmentStatePagerAdapter
fragmento paiYourAdapter adapter = new YourAdapter (getChildFragmentManager());
deve ser adicionadopara mim, tive que chamar isso no meu viewpager:
Tive o problema em que o viewpager não estava atualizando e tudo o que vi foi uma tela branca onde os fragmentos deveriam estar. Eu estava passando getChildFragmentManager, mas não ajudou.
fonte
No meu caso muito particular, onde eu estava usando um CoordinatorLayout com um AppBarLayout e o ViewPager, o que resolveu para mim foi remover o android: fitSystemWindows = "true" de minhas propriedades xml AppBarLayout .
Não me pergunte por quê. Eu sei que parece um pouco ridículo e como se não devesse ter correlação, mas era essa única linha a única coisa que estava causando problemas, pois eu já estava usando getChildFragmentManager () no meu adaptador. Passei um dia inteiro depurando meu código apenas para encontrar isso, então espero que poupe mais alguém algum tempo.
fonte
Eu tive o mesmo problema pelo qual mudei o adaptador de
FragmentPagerAdapter
paraFragmentStatePagerAdapter
egetFragmentManager()
no fragmento pai paragetChildFragmentManager()
A razão por trás disso é
FragmentStatePagerAdapter
útil no armazenamento de um grande número de páginas e a memória associada a cada página visitada é menor, pois mantém apenas o estado salvo do fragmento enquanto a página não está visível. Isso reduz a sobrecarga ao alternar entre os fragmentos.fonte
Tente colocar
setOffscreenPageLimit (int limit)
em pai ViewPager.Isso funcionou para mim como um charme.
No meu caso, eu tinha um fragmento dentro
TabLayout
comViewPager.
E outro
ViewPager
dentro desse fragmento. Na primeira vez, tudo está funcionando bem, mas quando mudo a guia e volto, parte do meu fragmento fica em branco.fonte
Isso ajudaria você.
fonte
Contornamos isso reimplementando os itens do pager de visualização como visualizações padrão em vez de fragmentos e alterando o adaptador de acordo.
fonte
Eu estava tendo esse mesmo problema no Xamarin Android com uma tela em branco na segunda vez .. Definir o seguinte corrigiu para mim.
fonte
Você também pode inicializar o adaptador para os casos em que ocorrer esse erro quando seu aplicativo for minimizado e chamado posteriormente.
fonte
Tive a mesma coisa, na segunda vez que chamo o Adaptador Pager, a visão filha retorna um NullPointerException. E mudar o adaptador em FragmentStatePagerAdapter resolve meu problema também.
fonte
Mude
FragmentPagerAdapter
paraFragmentStatePagerAdapter
uso emgetChildFragmentManager()
vez degetFragmentManager()
getChildFragmentManager()
- porque de acordo com a documentação, ele retornará um FragmentManager privado para colocar e gerenciar Fragments dentro deste Fragment. Enquanto issogetFragmentManager()
, retornará o FragmentManager para interagir com fragmentos associados a esta atividadefonte
classe ViewPagerAdapter extends FragmentStatePagerAdapter este trabalho para mim, tente isto
fonte