Elementi di azione dal frammento iniziale di Viewpager non visualizzati

Nell'applicazione che sto sviluppando sto utilizzando un ViewPager con frammenti e each frammento costruisce il proprio menu indipendentemente da tutti gli altri frammenti del ViewPager.

Il problema è che a volte i frammenti che vengono inizializzati da ViewPager per impostazione predefinita (cioè nello stato iniziale) non hanno i loro elementi popolati nel menu delle voci di azioni. Quel che è peggio è che questo problema si verifica solo intermittente. Se scorgo attraverso il ViewPager abbastanza in modo che i frammenti siano costretti a reinizializzare se stessi, quando spengo indietro, il menu popolerà correttamente.

  • ID canonico GCM
  • come modificare il text del button dynamicmente per each 3 secondi in android?
  • Il tipo di elemento "application" deve essere seguito da specifiche di attributo, ">" o "/>" # 2
  • Come submit la notifica a specifici utenti con FCM?
  • Come posso bloccare la periferica Android con una password a livello di programmazione
  • Imansible importre static android.support.test.express.contrib.DrawerMatchers.isOpen;
  • Codice attività:

    package net.solarnz.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. */ @Override 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); } @Override public int getCount() { return 8; } @Override public Fragment getItem(int position) { Fragment f = Fragment1.newInstance(position); // f.setRetainInstance(true); f.setHasOptionsMenu(true); return f; } } } 

    Codice di frammento:

     package net.solarnz.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 argument. Bundle args = new Bundle(); args.putInt("num", num); f.setArguments(args); return f; } @Override 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); } } 

    Disposizione:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <android.support.v4.view.ViewPager android:id="@+id/log_pager" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 

    Menu:

     <?xml version="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 azione che è popolato: http://i.stack.imgur.com/QFMDd.png

    Menu azione non popolato: http://i.stack.imgur.com/sH5Pp.png

  • Il frammento di controllo è attualmente visibile o non in android?
  • Android: utilizzando getIntent () solo su onCreate?
  • YouTube Api - Imansible cercare: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Proibito
  • Vuoi lanciare il registratore vocale predefinito dall'applicazione per catturare l'audio
  • Restituisce l'ampiezza dell'ingresso mic quando non si registra
  • Caricamento di immagini sul server Android
  • 7 Solutions collect form web for “Elementi di azione dal frammento iniziale di Viewpager non visualizzati”

    Dovresti leggere questo (da xcolw …)

    Attraverso la sperimentazione sembra che la causa principale sia invalidateOptionsMenu che viene chiamato più di uno senza una pausa sul thread principale per elaborare processi in coda. Un'idea – questo avrebbe importnza se una parte critica della creazione del menu fosse stata differita tramite un post, lasciando la barra d'azione in uno stato errato finché non viene eseguito.

    Ci sono alcuni punti che possono accadere che non sono evidenti:

    1. chiamando viewPager.setCurrentItem più volte per lo stesso elemento

    2. chiamando viewPager.setCurrentItem in onCreate dell'attività. setCurrentItem causa un menu di opzione invalidato, seguito immediatamente dal menu delle opzioni dell'attività invalidato

    Soluzioni alternative che ho trovato per ciascuno

    1. Guardia la chiamata per visualizzarePager.setCurrentItem

       if (viewPager.getCurrentItem() != position) viewPager.setCurrentItem(position); 
    2. Deferire la chiamata a viewPager.setCurrentItem in onCreate

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

    Dopo queste modifiche, il menu delle opzioni all'interno del visualizzatore di pagine sembra funzionare come previsto. Spero che qualcuno possa far luce in questo.

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

    La semplice risposta è di non utilizzare i menu all'interno di frammenti nel ViewPager. Se è necessario utilizzare i menu all'interno dei frammenti, quello che suggerisco è caricare il menu tramite il metodo onCreateOptionsMenu nell'attività principale. Ovviamente è necessario essere in grado di determinare quale menu da visualizzare.

    Sono riuscito a raggiungere questo objective utilizzando la riflessione di class. Inoltre, dovrai utilizzare il metodo invalidateOptionsMenu each volta che passerai le pagine. Avrà bisogno di un OnPageChangeListener per chiamarlo quando il ViewPager modifica le pagine.

    Ho avuto anche la stessa questione. Nel mio caso ho un'attività con viewpager che contiene due frammenti, each frammento gonfia il proprio menu di azione, ma il menu di azioni di frammento non mostrato.

    Visualizza il codice dell'adattatore pager

      public class ScreensAdapter extends FragmentPagerAdapter { public TrackerScreensAdapter(Context context, FragmentManager fm) { super(fm); } @Override 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; } } 

    Attività in creazione

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

    In questo modo il mio viewPager ha due frammenti, each frammento spara il proprio task in onActivityCreated, ottiene i dati e disegna il suo layout in base ai dati ottenuti. Inoltre each frammento ha onCreateOptionsMenu

      @Override 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); } 

    Spesso molte volte per risolvere questo problema e capire perché il menu di frammento non viene mostrato. Tutto quello di cui avevo bisogno era

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

    Per prima cosa creare un metodo nella sottoclass di FragmentPagerAdapter per get il frammento corrente

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

    Ora sovrascrivi sotto i methods in Main Actvity

     @Override 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("Clear").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add("Factory data reset").setShowAsAction( MenuItem.SHOW_AS_ACTION_IF_ROOM); } return super.onCreateOptionsMenu(menu); } 

    Ora call l'onOptionItemSelected dall'attività al frammento

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

    Ho risolto un problema molto simile in cui le icone delle barre di azione assegnate dal frammento all'interno di un ViewPager stavano scomparendo suPause (). Si riappariranno quando il frammento è tornato in vista e l'utente ha spostato a sinistra oa destra, ma non immediatamente. La soluzione stava chiamando notifyDataSetChanged () sul PagerAdapter nel metodo onResume () del frammento.

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

    Stavo avendo questo problema con gli elementi della barra di azione mentre stavo utilizzando HorizontalScrollView per mostrare le tabs, ma ho cambiato su PagerTitleStrip e il problema è stato risolto.

    Forse queste informazioni possono aiutare qualcun altro.

    Nel mio caso ho tracciato la causa principale del problema a quello che credo sia un bug in FragmentStatePagerAdapter che chiama Fragment # setMenuVisibility a false e non riesce ad impostarla correttamente a true quando ripristina lo stato.

    soluzioni alternative:

    1. Utilizzare FragmentPagerAdapter invece di FragmentStatePagerAdapter

    2. Se è necessario utilizzare FragmentStatePagerAdapter, nella sottoclass dell'adattatore sostituire setPrimaryItem come segue:

       @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { super.setPrimaryItem(container, position, object); //This is a workaround for a bug in FragmentStatePagerAdapter Fragment currentItem = getItem(position); if (currentItem != null) { currentItem.setMenuVisibility(true); currentItem.setUserVisibleHint(true); } } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.