FragmentStatePageAdapter duplica itens do menu ActionBair

Eu tenho um problema com FragmentStatePageAdapter (que eu uso como adaptador paira um ViewPager) e os itens de menu da bairra de ação.

Quando eu lanço o aplicativo, tudo está bem. Se eu moview a tairefa paira o plano de background (por exemplo, pressionando o button HOME) e eu começo a fazer coisas até que a atividade termine, então quando eu voltair paira minha aplicação (através do iniciador ou uma notificação que eu criei) tudo está bem, exceto que existem itens de menu duplicados na bairra de ação.

  • Seleção do Spinner do Android
  • Coloque a vista dentro do FrameLayout no Android
  • Android - Ajuste a canvas quando o keyboard apairece?
  • Upload de files no WebView
  • dialog personalizado com button fechair
  • Qual é a diferença de setVisibility (View.INVISIBLE); SetVisibility (0);
  • Um detalhe importante é que os únicos itens duplicados são aqueles que são criados no onCreateOptionsMenu () de cada fragment que eu uso no ViewPager.

    Se eu replaceFragmentStatePageAdapter com FragmentPageAdapter, os itens não são mais duplicados, mas os fragments não são exibidos no ViewPager (a function getItem () do adaptador nunca é chamada paira que ele não devolva nenhum fragment).

    Alguma ideia? Uma maneira de evitair FragmentStatePageAdapter paira duplicair itens de menu? Talvez use FragmentPageAdapter, mas com uma modificação paira mostrair os fragments? Uma modificação em meus fragments?

    Aqui estão alguns trechos de código da minha aplicação …

    Como os itens do menu são criados dentro dos fragments:

    @Oviewride public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { /* Create play button */ final MenuItem mPlay = menu.add(R.string.play_all); mPlay.setIcon(R.drawable.ic_play_all); mPlay.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); mPlay.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Oviewride public boolean onMenuItemClick(MenuItem item) { final List<Song> songs = getSongs(); if (songs.size() == 0) { /* Show message */ Toast.makeText(mContext, R.string.no_song_list, Toast.LENGTH_LONG).show(); } else { /* Play song list */ try { PlayManager.getService().playList(songs); } catch (Exception e) {} } return false; } }); /* Create menu */ super.onCreateOptionsMenu(menu, inflater); } 

    Como os fragments são instanciados no adaptador do ViewPager

     @Oviewride public Fragment getItem(int position) { final Class<?> cls = mTabs.get(position); /* No tab */ if (cls == null) return null; /* Instantiate fragment */ final Fragment fragment = Fragment.instantiate(mContext, cls.getName(), null); /* Add to list */ mFragments.put(position, fragment); /* Return fragment */ return fragment; } return nulo; @Oviewride public Fragment getItem(int position) { final Class<?> cls = mTabs.get(position); /* No tab */ if (cls == null) return null; /* Instantiate fragment */ final Fragment fragment = Fragment.instantiate(mContext, cls.getName(), null); /* Add to list */ mFragments.put(position, fragment); /* Return fragment */ return fragment; } 

    Obrigado!

    PS: Tentei mudair o modo de lançamento da atividade paira "singleTop" e eu também tentei retornair no getItem () o fragment previamente criado (mas isso é inútil como getItem () nunca é chamado quando eu return ao aplicativo, como eu disse antes).

  • Inicie uma atividade quando a canvas estiview ativada.
  • commitAllowingStateLoss () e commit () fragment
  • O Android mantém o estado de callback após a mudança de configuration
  • RxJava como ônibus de events?
  • O Android Webview ajusta todo o conteúdo na canvas
  • Problema do Android 6.0 Mairshmallow UsageStatsManager ao tentair recuperair o aplicativo de primeiro plano
  • 4 Solutions collect form web for “FragmentStatePageAdapter duplica itens do menu ActionBair”

    Encontrei uma solução paira o meu problema alguns dias depois de postair o meu problema. Desculpe-me por colocair isso aqui tão tairde.

    O código a seguir corrigiu meu problema:

     @Oviewride protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.remove("android:support:fragments"); } 

    Tão simples como escreview esse pedaço de código na atividade onde eu instancio e uso os fragments.

    Eu espero que isso ajude 🙂

    Antes de inflair o menu de opções em seu Fragmento dentro do ViewPager, viewifique se a instância Fragment está visível paira evitair itens de menu duplicados:

     // This should be in your Fragment implementation public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if(isVisible()) { inflater.inflate(R.menu.menu_fragment, menu); } super.onCreateOptionsMenu(menu, inflater); } { // This should be in your Fragment implementation public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if(isVisible()) { inflater.inflate(R.menu.menu_fragment, menu); } super.onCreateOptionsMenu(menu, inflater); } { // This should be in your Fragment implementation public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if(isVisible()) { inflater.inflate(R.menu.menu_fragment, menu); } super.onCreateOptionsMenu(menu, inflater); } } // This should be in your Fragment implementation public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if(isVisible()) { inflater.inflate(R.menu.menu_fragment, menu); } super.onCreateOptionsMenu(menu, inflater); } 

    Eu suponho que o problema é que o FragmentStatePagerAdapter cria um novo Fragmento cada vez que você desliza. Como resultado, onCreateOptionsMenu () é chamado paira cada Fragmento que é criado.

    Existem, penso eu, duas soluções:

    1. Tire a manipulação da bairra de ação paira fora dos Fragmentos. Em vez de configurair um onclick paira o item de menu dentro do Fragment, você envia uma mensagem paira o Fragmento atual da atividade.

    2. Use Menu.findItem () paira view se outro Fragmento já adicionou o MenuItem que deseja e, se assim, anexe o Fragmento atual a ele (em onPrepaireOptionsMenu ()).

    Eu findi uma solução tentando que possa ser trabalho

    No seu fragment de menu duplicado Adicione menu.cleair() antes de inflair o file do menu em onCreateOptionsMenu(Menu menu, MenuInflater inflater)

     @Oviewride public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.cleair(); inflater.inflate(R.menu.main,menu); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.