Come get l'istanza del frammento attualmente visibile in ViewPager:

Sto costruendo un'applicazione che mostra frammenti diversi in un ViewPager . Aggiungo questi frammenti al ViewPager come questo:

  public void intialiseViewPager() { List<Fragment> fragments = new Vector<Fragment>(); numberOfTabs = application.currentReport.getODTabsList().size(); for (int i = 0; i < numberOfTabs; i++) { ODTab tempTab = application.currentReport.getODTabsList().get(i); if (tempTab.getTabType().equals(ODGrid.XML_GRID_ELEMENT)) { GridFragment gridFragment = GridFragment.newInstance(tempTab.getTabId()); fragments.add(gridFragment); } else if (tempTab.getTabType().equals(ODChart.XML_CHART_ELEMENT)) { NewChartFragment chartFragment = NewChartFragment.newInstance(tempTab.getTabId()); fragments.add(chartFragment); } } Log.d(TAG, "Current report fragments set to adapter: "+fragments.toString()); mPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments); mViewPager = (ViewPager)findViewById(R.id.pager); mViewPager.setAdapter(mPagerAdapter); mViewPager.setOffscreenPageLimit(0); mViewPager.setOnPageChangeListener(this); } 

Come potete vedere, passa al frammento un String ( tempTab.getTabId() ), in questa row:

  • Avvio di un'attività da un servizio dopo il button HOME premuto senza il ritardo di 5 secondi
  • Perché non esiste una strumentazione di prova per BroadcastReceiver?
  • L'icona nella scheda non è visualizzata
  • Query per get record basati su Radius in SQLite?
  • Come faccio a creare una linea tratteggiata / tratteggiata in Android?
  • android.content.Context.getPackageName () 'su un riferimento di null object
  •  GridFragment gridFragment = GridFragment.newInstance(tempTab.getTabId()); 

    Nel frammento stesso lo faccio per inizializzarlo:

     public static final GridFragment newInstance(String tabId) { GridFragment f = new GridFragment(); Bundle bdl = new Bundle(2); bdl.putString(TAB_ID, tabId); f.setArguments(bdl); return f; } @Override public void onCreate(Bundle savedInstanceState) { String tabId = getArguments().getString(TAB_ID); if (application.currentReport != null) { this.odTab = application.currentReport.getODTabByTabId(tabId); } else { startActivity(new Intent(getActivity(), LoginScrActivity.class)); } super.onCreate(savedInstanceState); } 

    Tutto questo viene eseguito per non superare il constructor di vuoto predefinito del frammento, come ho capito che questo non è consigliato.

    Ora ho bisogno di get l'istanza dell'object odTab che ho inserito nel frammento attualmente visibile in questa linea:

     this.odTab = application.currentReport.getODTabByTabId(tabId); 

    Qualcuno potrebbe spiegarmi come potrebbe essere fatto? Come ottengo l'istanza di frammento attualmente visibile in modo da poter estrarre l'object odTab?

    AGGIORNAMENTO: Con i suggerimenti che ho ricevuto qui ho aggiunto odTab object odTab alla class di applicazione che si chiama currentVisibleTab e sto impostando l'istanza di odTab come questo:

     @Override public void setUserVisibleHint(boolean isVisibleToUser) { Log.d(TAG, "setUserVisibleHint invoked!"); super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { if (odTab != null && getActivity() != null) { Log.d(TAG, "Currently visable tab: "+odTab.getTabTitle()); application.currentVisibleTab = odTab; } } } 

    UPDATE2: Questo è il mio ViewPagerAdapter :

     public class ViewPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragments; /** * @param fm * @param fragments */ public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) { super(fm); this.fragments = fragments; } /* (non-Javadoc) * @see android.support.v4.app.FragmentPagerAdapter#getItem(int) */ @Override public Fragment getItem(int position) { return this.fragments.get(position); } /* (non-Javadoc) * @see android.support.v4.view.PagerAdapter#getCount() */ @Override public int getCount() { return this.fragments.size(); } @Override public int getItemPosition(Object object) { return POSITION_NONE; } public void removeAllFragments() { this.fragments.clear(); } public void addFragmentsListToAdapter(List<Fragment> fragments) { this.fragments.addAll(fragments); } public List<Fragment> getFragments() { return fragments; } } 

    In esso ho un List di frammenti che vengono visualizzati da ViewPager . Questo elenco viene inizializzato in questo modo:

      List<Fragment> fragments = new Vector<Fragment>(); 

    Quello che non capisco è come faccio un riferimento al frammento corrente che ha innescato il metodo di interface da questo elenco. E questa non è una questione correlata, ma forse sapete la risposta: qual è la differenza tra List e Vector ?

    Ho ancora controllato questa opzione.

  • adb shell dumpsys iphonesubinfo non funziona da Android 5.0 Lollipop
  • Metodo di rilascio di touch in Android
  • Come tenere traccia degli ascoltatori in Firebase su Android?
  • eseguire il servizio anche se l'applicazione è chiusa (uccisa)
  • Android Studio non si lancia dopo l'installazione
  • Come definire dimens.xml per each dimensione dello schermo in android?
  • 2 Solutions collect form web for “Come get l'istanza del frammento attualmente visibile in ViewPager:”

    Il modo in cui ho trovato il frammento attualmente visibile utilizza setUserVisibleHint e un'interface di nuovo al ViewPager . Questo metodo è nella class di frammento . Sostituirlo e utilizzare un'interface per ricall il tuo ViewPager . Se il frammento è visibile – vale a dire che restituisce true – utilizza semplicemente un riferimento al tuo frammento (dall'elenco che support l'adattatore o uno memorizzato come una variabile di istanza) per get tutto ciò che ti serve dal frammento stesso. Ho aggiunto il codice qui sotto.

    Dichiarare un'interface relativa a ciò che vuoi fare. Nel mio caso stavo usando questo per distriggersre l' ViewPager default di ViewPager quando un'istanza di Google Map era visibile in modo che lo scorrimento della mappa non avrebbe innescato la modifica del frammento.

     public interface OnMapFragmentVisibleListener{ public void mapVisible(boolean visible); } 

    Nel frammento:

     @Override public void onAttach(Activity activity){ super.onAttach(activity); try{ mapFragmentVisibilityListener = (OnMapFragmentVisibleListener) activity; isAttached = true; //flag for whether this fragment is attached to pager } catch (ClassCastException e){ throw new ClassCastException(activity.toString() + " must implement interface onAttach"); } @Override public void setUserVisibleHint(boolean isVisibleToUser){ if(isVisibleToUser && isAttached){ //if listener is called before fragment is attached will throw NPE mapFragmentVisibilityListener.mapVisible(true); } } 

    Una cosa che non era ovvio fino a quando non ho provato questo era l'aggiunta della variabile isAttached. Inoltre, sovrascrivere i frammenti di metodo onAttach e impostare questo a true una volta che viene chiamato. Altrimenti ciò che succede è che il tuo frammento sarà visibile all'utente e cercare di call l'interface al tuo ViewPager prima di inizializzare l'interface.

    Nel mio ViewPager implemento semplicemente OnMapFragmentVisibleListener e quindi aggiungo il metodo richiesto

      @Override public void mapVisible(boolean visible) { if(visible) viewPager.allowSwipe(false); //turn off viewPager intercept touch if map visible } 

    Nel mio caso ho usato per distriggersre la function di scorrimento ViewPager . Tuttavia, avrei potuto facilmente ricall un metodo pubblico nel mio frammento di mappe. Ho ViewPager di avere 3 frammenti nel mio ViewPager che io tengo a fare riferimento.

    Aggiornare

    Per trovare il frammento attualmente visualizzato, devi prima scoprire quale frammento viene visualizzato. Puoi fare questo in diversi modi. Il più semplice è passare un po 'di descrittore al tuo ViewPager / FragmentActivity con l'interface che hai creato prima.

     public interface OnFragmentVisibleListener{ public void fragmentVisible(boolean true, String tag); } 

    Il problema con il tuo setup è che stai utilizzando un Vector che è veramente un List sincronizzato per memorizzare i riferimenti di frammento. Di conseguenza, non esiste un valore chiave che consente di individuare i tuoi frammenti in un secondo momento. I frammenti hanno la capacità di essere identificati da un tag che viene creato durante la transazione di frammento quando vengono aggiunti all'attività di frammento. Tuttavia, in un setup di ViewPager , non si aggiungono i frammenti singolarmente e quindi non è ansible aggiungere tag durante la transazione.

    La mia soluzione è stata quella di ripristinare il mio BasePagerAdapter con un HashMap in cui memorizzo each frammento identificato da una chiave univoca.

      LinkedHashMap<String, Fragment> tabs = new LinkedHashMap<String, Fragment>(); tabs.put("Frag1", fragment1); tabs.put("Frag2", fragment2); tabs.put("Frag3", fragment3); 

    Quindi lo uso nella scheda:

     private class BasePagerAdapter extends FragmentPagerAdapter{ private LinkedHashMap<String, Fragment> tabs; public BasePagerAdapter(LinkedHashMap<String, Fragment> tabMap, FragmentManager fm) { super(fm); this.tabs = tabMap; } // other basic methods 

    Poiché i tuoi riferimenti sono memorizzati nei valori fondamentali, è facile trovare il frammento che stai cercando, poiché è ansible eseguire la ricerca solo per la chiave del HashMap e ritornare.

    Se non è ansible modificare l'impostazione per uscire dal Vector è necessario (1) tenere traccia di quale frammento si aggiunge in quale ordine (supponendo che i frammenti non siano aggiunti e rimossi in modo dinamico) in modo da poterlo get per indice o (2 ) mantenere riferimenti separati a ciascun frammento.

     private Fragment x; //in onCreate x = new Fragment(); //in interface if(tag.equals("x"){ x.doSomething(); } 

    Un'altra cosa che rende più facile è che i miei frammenti siano tutti sottoposti a classi. Ad esempio, each frammento che esegue una function diversa ha una propria class. Poiché c'è una sola istanza di each class, è facile da trovare poiché non ho nessun duplicato. Se utilizzi tutti i membri generici della class Fragment , devi solo implementare un sistema di tagging che rende ansible uno degli approcci sopra indicati.

    È ansible get il frammento visibile corrente utilizzando il metodo viewpager.getCurrentItem () nel modo seguente:

    Fragmento fr = getSupportFragmentManager (). FindFragmentByTag ("android: switcher:" + R.id.pager + ":" + mViewPager.getCurrentItem ());

    Grazie,

    Sulabh

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.