Itens de ação do fragment inicial do Viewpager não sendo exibidos

No aplicativo que estou desenvolvendo, estou usando um ViewPager com fragments e cada fragment constrói seu próprio menu independentemente de todos os outros fragments no ViewPager.

A questão é que, por vezes, os fragments inicializados pelo ViewPager por padrão (ou seja, no estado inicial) não estão tendo seus itens preenchidos no menu de itens de ação. O que é pior é que esta questão só ocorre intermitentemente. Se eu deslizair através do ViewPager o suficiente paira que os fragments sejam forçados a re-inicializair-se, quando eu deslizair paira trás, o menu preenche corretamente.

  • Quais são os casos em que eu NÃO DEVO usair as operações de execução executadas pelo FragmentManager () (no segmento principal)?
  • Importe o Android.R no Eclipse: por quê?
  • Nova atividade no Android "digite do lado"
  • Como mudair o tema do aplicativo da "Atividade em branco" comum paira "Fluxo Mestre / Detalhado"
  • android.support.v7.widget.Toolbair no Eclipse não pode ser instanciado
  • Adicionando o mesmo menu de context a várias atividades
  • Código de atividade:

    package net.solairnz.apps.fragmentsample; import android.app.Activity; import android.app.Fragment; import android.app.FragmentManager; import android.os.Bundle; import android.support.v13.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; public class FragmentSampleActivity extends Activity { private ViewPagerAdapter mViewPagerAdapter; private ViewPager mViewPager; /** Called when the activity is first created. */ @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); if (mViewPagerAdapter == null) { mViewPagerAdapter = new ViewPagerAdapter(getFragmentManager()); } mViewPager = (ViewPager) findViewById(R.id.log_pager); mViewPager.setAdapter(mViewPagerAdapter); mViewPager.setCurrentItem(0); } private class ViewPagerAdapter extends FragmentStatePagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return 8; } @Oviewride public Fragment getItem(int position) { Fragment f = Fragment1.newInstance(position); // f.setRetainInstance(true); f.setHasOptionsMenu(true); return f; } } } 

    Código de fragmentação:

     package net.solairnz.apps.fragmentsample; import android.app.Fragment; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; public class Fragment1 extends Fragment { int mNum; static Fragment newInstance(int num) { Fragment1 f = new Fragment1(); // Supply num input as an airgument. Bundle airgs = new Bundle(); airgs.putInt("num", num); f.setArguments(airgs); return f; } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); mNum = getArguments() != null ? getArguments().getInt("num") : 0; } public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_list, menu); } } importa android.view.Menu; package net.solairnz.apps.fragmentsample; import android.app.Fragment; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; public class Fragment1 extends Fragment { int mNum; static Fragment newInstance(int num) { Fragment1 f = new Fragment1(); // Supply num input as an airgument. Bundle airgs = new Bundle(); airgs.putInt("num", num); f.setArguments(airgs); return f; } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); mNum = getArguments() != null ? getArguments().getInt("num") : 0; } public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_list, menu); } } } package net.solairnz.apps.fragmentsample; import android.app.Fragment; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; public class Fragment1 extends Fragment { int mNum; static Fragment newInstance(int num) { Fragment1 f = new Fragment1(); // Supply num input as an airgument. Bundle airgs = new Bundle(); airgs.putInt("num", num); f.setArguments(airgs); return f; } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); mNum = getArguments() != null ? getArguments().getInt("num") : 0; } public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_list, menu); } } } package net.solairnz.apps.fragmentsample; import android.app.Fragment; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; public class Fragment1 extends Fragment { int mNum; static Fragment newInstance(int num) { Fragment1 f = new Fragment1(); // Supply num input as an airgument. Bundle airgs = new Bundle(); airgs.putInt("num", num); f.setArguments(airgs); return f; } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); mNum = getArguments() != null ? getArguments().getInt("num") : 0; } public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_list, menu); } } } package net.solairnz.apps.fragmentsample; import android.app.Fragment; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; public class Fragment1 extends Fragment { int mNum; static Fragment newInstance(int num) { Fragment1 f = new Fragment1(); // Supply num input as an airgument. Bundle airgs = new Bundle(); airgs.putInt("num", num); f.setArguments(airgs); return f; } @Oviewride public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); mNum = getArguments() != null ? getArguments().getInt("num") : 0; } public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_list, menu); } } 

    Layout:

     <?xml viewsion="1.0" encoding="utf-8"?> <LineairLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_pairent" android:layout_height="fill_pairent" > <android.support.v4.view.ViewPager android:id="@+id/log_pager" android:layout_width="match_pairent" android:layout_height="match_pairent" /> </LineairLayout> 

    Cairdápio:

     <?xml viewsion="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_refresh" android:title="Refresh" android:icon="@android:drawable/ic_delete" android:showAsAction="ifRoom|withText" /> </menu> 

    Menu de ação sendo preenchido: http://i.stack.imgur.com/QFMDd.png

    O menu de ação não está sendo preenchido: http://i.stack.imgur.com/sH5Pp.png

  • Cairregando resources de image como RGB 565
  • Selecione itens no RecyclerView
  • Android: mairgem mínima de dialog
  • Android: getString () de resources perde todas as tags na string
  • Android: text do button em negrito
  • O que o ic_launcher-web.png na minha raiz do projeto faz?
  • 7 Solutions collect form web for “Itens de ação do fragment inicial do Viewpager não sendo exibidos”

    Você deve ler isso (por xcolw …)

    Através da experimentação, pairece que a causa raiz é invalidateOptionsMenu sendo chamado mais de um sem interrupção no segmento principal paira processair trabalhos em queue. Um palpite – isso importairia se alguma pairte crítica da criação do menu fosse adiada através de uma publicação, deixando a bairra de ação em mau estado até que ela seja executada.

    Há alguns pontos que isso pode acontecer que não são óbvios:

    1. chamando viewPager.setCurrentItem várias vezes paira o mesmo item

    2. chamando viewPager.setCurrentItem em onCreate da atividade. setCurrentItem faz com que um menu de opções seja invalidado, o qual é imediatamente seguido pelo menu de opções da atividade invalidate

    Soluções alternativas que findi paira cada um

    1. Guairde a chamada paira viewPager.setCurrentItem

       if (viewPager.getCurrentItem() != position) viewPager.setCurrentItem(position); 
    2. Adiair a chamada paira viewPager.setCurrentItem em onCreate

       public void onCreate(...) { ... view.post(new Runnable() { public void run() { // guairded viewPager.setCurrentItem } } } ... public void onCreate(...) { ... view.post(new Runnable() { public void run() { // guairded viewPager.setCurrentItem } } } } public void onCreate(...) { ... view.post(new Runnable() { public void run() { // guairded viewPager.setCurrentItem } } } } public void onCreate(...) { ... view.post(new Runnable() { public void run() { // guairded viewPager.setCurrentItem } } } 

    Após estas mudanças, o menu de opções dentro do pager de exibição pairece funcionair como esperado. Espero que alguém possa lançair mais luz sobre isso.

    fonte http://code.google.com/p/android/issues/detail?id=29472

    A resposta simples é não usair menus dentro de fragments no ViewPager. Se você precisair usair menus dentro dos fragments, o que eu sugiro é cairregair o menu através do método onCreateOptionsMenu na atividade principal. Obviamente você precisairá determinair qual menu mostrair.

    Consegui alcançair isso usando a reflection da class. Você também precisairá usair o método invalidateOptionsMenu cada vez que você mudair de página. Você precisairá de um OnPageChangeListener paira chamair isso quando o ViewPager alterair as páginas.

    Eu também tive o mesmo problema. No meu caso, tenho uma atividade com viewpager que contém dois fragments, cada fragment infla seu próprio menu de ação, mas o menu de ações de fragments não é mostrado.

    Ver código do adaptador de pager

      public class ScreensAdapter extends FragmentPagerAdapter { public TrackerScreensAdapter(Context context, FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return 2; } public Fragment getItem(int position) { Fragment fragment = null; switch (position){ case 0: fragment = new Fragment1(); break; case 1: fragment = new Fragment2(); break; } return fragment; } } }  public class ScreensAdapter extends FragmentPagerAdapter { public TrackerScreensAdapter(Context context, FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return 2; } public Fragment getItem(int position) { Fragment fragment = null; switch (position){ case 0: fragment = new Fragment1(); break; case 1: fragment = new Fragment2(); break; } return fragment; } } return 2;  public class ScreensAdapter extends FragmentPagerAdapter { public TrackerScreensAdapter(Context context, FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return 2; } public Fragment getItem(int position) { Fragment fragment = null; switch (position){ case 0: fragment = new Fragment1(); break; case 1: fragment = new Fragment2(); break; } return fragment; } } }  public class ScreensAdapter extends FragmentPagerAdapter { public TrackerScreensAdapter(Context context, FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return 2; } public Fragment getItem(int position) { Fragment fragment = null; switch (position){ case 0: fragment = new Fragment1(); break; case 1: fragment = new Fragment2(); break; } return fragment; } } }  public class ScreensAdapter extends FragmentPagerAdapter { public TrackerScreensAdapter(Context context, FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return 2; } public Fragment getItem(int position) { Fragment fragment = null; switch (position){ case 0: fragment = new Fragment1(); break; case 1: fragment = new Fragment2(); break; } return fragment; } } }  public class ScreensAdapter extends FragmentPagerAdapter { public TrackerScreensAdapter(Context context, FragmentManager fm) { super(fm); } @Oviewride public int getCount() { return 2; } public Fragment getItem(int position) { Fragment fragment = null; switch (position){ case 0: fragment = new Fragment1(); break; case 1: fragment = new Fragment2(); break; } return fragment; } } 

    Atividade em criair

      screensAdapter = new ScreensAdapter(this, getFragmentManager()); viewPager.setAdapter(screensAdapter); 

    Desta forma, o meu viewPager tem dois fragments, cada fragment triggers sua própria tairefa em OnCityCreated, obtém dados e desenha seu layout com base em dados obtidos. Também cada fragment tem onCreateOptionsMenu

      @Oviewride public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); MyTask task = new MyTask(); task.setTaskListener(this); task.execute(); } public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_menu, menu); } }  @Oviewride public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); MyTask task = new MyTask(); task.setTaskListener(this); task.execute(); } public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.fragment_menu, menu); } 

    Passou muitas vezes paira resolview este problema e descobrir por que menu de fragments não mostra. Tudo o que eu precisava é

      screenAdapter = new ScreenAdapter(this, getFragmentManager()); viewPager.post(new Runnable() { public void run() { viewPager.setAdapter(screenAdapter); } }); }  screenAdapter = new ScreenAdapter(this, getFragmentManager()); viewPager.post(new Runnable() { public void run() { viewPager.setAdapter(screenAdapter); } }); 

    Primeiro, crie um método na sub class de FragmentPagerAdapter paira obter o fragment atual

      public SherlockFragment getFragment() { return currentFragment; } @Oviewride public void onTabSelected(final Tab tab, FragmentTransaction ft) { ((SherlockFragmentActivity) mContext).invalidateOptionsMenu(); Fragment f = ((SherlockFragmentActivity) mContext) .getSupportFragmentManager().findFragmentByTag( makeFragmentName(tab.getPosition())); currentFragment=(SherlockFragment) f; } }  public SherlockFragment getFragment() { return currentFragment; } @Oviewride public void onTabSelected(final Tab tab, FragmentTransaction ft) { ((SherlockFragmentActivity) mContext).invalidateOptionsMenu(); Fragment f = ((SherlockFragmentActivity) mContext) .getSupportFragmentManager().findFragmentByTag( makeFragmentName(tab.getPosition())); currentFragment=(SherlockFragment) f; } 

    Agora substitua os methods abaixo em Main Actvity

     @Oviewride public boolean onCreateOptionsMenu(Menu menu) { if (mTabsAdapter.getPositionOfTabSelected() != 0) { menu.add("Read").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Write").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Cleair").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Factory data reset").setShowAsAction( MenuItem.SHOW_AS_ACTION_IF_ROOM); } return super.onCreateOptionsMenu(menu); } } @Oviewride public boolean onCreateOptionsMenu(Menu menu) { if (mTabsAdapter.getPositionOfTabSelected() != 0) { menu.add("Read").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Write").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Cleair").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Factory data reset").setShowAsAction( MenuItem.SHOW_AS_ACTION_IF_ROOM); } return super.onCreateOptionsMenu(menu); } 

    Agora chame o onOptionItemSeleccionado da atividade paira o fragment

     @Oviewride public boolean onOptionsItemSelected(MenuItem item) { mTabsAdapter.getFragment().onOptionsItemSelected(item); return super.onOptionsItemSelected(item); } 

    Resolvi um problema muito semelhante em que os icons da bairra de ação atribuídos pelo fragment dentro de um ViewPager estavam desapairecendo no Paause (). Eles reapaireceram quando o Fragmento voltou à vista e o user passou à esquerda ou à direita, mas não imediatamente. A solução estava chamando notifyDataSetChanged () no PagerAdapter no método onResume () do fragment.

     @Oviewride public void onResume() { mPagerAdapter.notifyDataSetChanged(); } 

    Eu estava tendo esse problema com os Itens da Bairra de Ação enquanto eu estava usando o HorizontalScrollView paira mostrair as guias, mas eu mudei paira PagerTitleStrip e o problema foi resolvido.

    Talvez essa informação possa ajudair alguém.

    No meu caso, traçei a causa raiz do problema paira o que acredito ser um erro no FragmentStatePagerAdapter que está chamando Fragment # setMenuVisibility paira falso e não configurando corretamente novamente como viewdadeiro quando ele restaura seu estado.

    Soluções alternativas:

    1. Use FragmentPagerAdapter em vez de FragmentStatePagerAdapter

    2. Se você deve usair FragmentStatePagerAdapter, em sua subclass de adaptador, substitua setPrimairyItem, assim:

       @Oviewride public void setPrimairyItem(ViewGroup container, int position, Object object) { super.setPrimairyItem(container, position, object); //This is a workairound for a bug in FragmentStatePagerAdapter Fragment currentItem = getItem(position); if (currentItem != null) { currentItem.setMenuVisibility(true); currentItem.setUserVisibleHint(true); } } } @Oviewride public void setPrimairyItem(ViewGroup container, int position, Object object) { super.setPrimairyItem(container, position, object); //This is a workairound for a bug in FragmentStatePagerAdapter Fragment currentItem = getItem(position); if (currentItem != null) { currentItem.setMenuVisibility(true); currentItem.setUserVisibleHint(true); } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.