Come posso impostare un tag per il viewpager frammenti?

I,m slidingTabLayout con 4 schede e un viewpager e 4 frammento di classe per ogni scheda.

ho bisogno di ricaricare uno dei miei frammenti (prima scheda) nel mio progetto, quando l’utente fare clic su alcuni pulsanti, e per questo ho bisogno di avere un tag per l’frammento

la mia domanda è : come posso impostare un tag per uno dei viewpagers frammento???

Mio obbiettivo principale l’allevamento scheda e viewpager codici:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {



Toolbar toolbar;
ViewPager pager;
ViewPagerAdapter adapter;
SlidingTabLayout tabs;
CharSequence Titles[]={"نوع","قیمت","برند","همه"};
int Numboftabs = 4;




@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);




    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "درج آگهی رایگان", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });



    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);




    //Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs.
    adapter =  new ViewPagerAdapter(getSupportFragmentManager(),Titles,Numboftabs);

    //Assigning ViewPager View and setting the adapter
    pager = (ViewPager) findViewById(R.id.pager);
    pager.setAdapter(adapter);

    //Assiging the Sliding Tab Layout View
    tabs = (SlidingTabLayout) findViewById(R.id.tabs);
    tabs.setDistributeEvenly(true); //To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width

    //Setting Custom Color for the Scroll bar indicator of the Tab View
    tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
        @Override
        public int getIndicatorColor(int position) {
            return getResources().getColor(R.color.colorWhite);
        }
    });

    //Setting the ViewPager For the SlidingTabsLayout
    tabs.setViewPager(pager);
    pager.setCurrentItem(3);




} and ....

Ringrazio molto

  • se si desidera utilizzare frammenti già in viewpager, è possibile utilizzare l’adattatore di getItem(posizione) metodo. e per i tag, penso che si dovrebbe passare il tag nel Costruttore della Scheda e quindi ogni serie di frammenti.
  • grazie amico mio , ma mi potete spiegare di più su passando per il tag adattatore? grazie
InformationsquelleAutor K1-Aria | 2016-01-18



3 Replies
  1. 26

    Ci sono un paio di soluzioni per questo.

    1). Quando il FragmentPagerAdapter aggiunge un Fragment per il FragmentManager, utilizza uno speciale tag in base alla posizione particolare che la Fragment sarà posto. Così si può ottenere semplicemente la corrente visibile Fragment nel ViewPager utilizzando queste linee di codice

     Fragment fragment = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager + ":" + ViewPager.getCurrentItem());
     //based on the current position you can then cast the page to the correct Fragment class and call some method inside that fragment to reload the data:
     if (0 == ViewPager.getCurrentItem() && null != fragment) {
          ((TabFragment1)fragment).reloadFragmentData();     
     } 

    2). Si consiglia di tenere traccia di tutti i frammenti in FragmentStatePagerAdapter. Per la demo di esempio si può fare riferimento al secondo approccio qui

    3). Si può fare uso di EventBus per gli eventi di post per il tuo Fragment da qualsiasi luogo. Tutto quello che dovete fare è registrare il vostro Fragment per quello specifico evento. Per la documentazione ufficiale di riferimento questo

    • ma ho appena usato ViewPagerAdapter . cosa devo fare?
    • il ViewPagerAdapter può essere estendere FragmentPagerAdapter o FragmentStatePagerAdapter. non è vero?
    • n i,m non ha usato mai!!!! c’è qualche altro wat per il tag frammentazione? idont sapere perché è così difficile!!!
    • si può andare con la terza soluzione, quindi, è una soluzione universale e funziona di sicuro, senza problemi.
    • aha! Grazie . ora con EventBus posso Tag frammenti?? o posso aggiornare??
    • è possibile aggiornare. Non è necessario impostare alcun tag. Devi solo registrarti il tuo Frammento per ricaricare evento che si può postare ovunque
    • avete qualche tutorial o un esempio su questo issuse??
    • Anche se la documentazione ufficiale è già il campione per questo, ma è possibile fatemi sapere i vostri requisiti specifici dire dove il pulsante è presente etc. , Ti farò sapere come si può procedere ulteriormente
    • il pulsante era un esempio per spiegare il mio issuse , in realtà voglio aggiornare il frammento quando l’utente scorrere in basso la pagina con il dito di aggiornamento layout
    • e dove è che passare il dito verso di aggiornamento layout? nello stesso Frammento?
    • Sì, esattamente in quel frammento,s XML che voglio aggiornare
    • Allora a cosa serve farsi Frammento di Tag e di ricarico che, si può semplicemente aggiornare il frammento di dati mediante la creazione di una funzione per l’aggiornamento dei dati e la chiamata di funzione nel Frammento di sé quando SwipeRefresh completa. Inoltre, se si desidera ricaricare l’intero Frammento , io ho ancora una soluzione. Fatemi sapere se volete che.
    • sì , amico mio, esattamente voglio aggiornare il mio recyclerview elementi dal db e JSON , e scrivo il mio metodo getdata() in swipe aggiornamento layout , in caso di aggiornamento ascoltatore , ma il problema è questo : la mia lista non si aggiorna con nuovi elementi , questa è la mia domanda principale : stackoverflow.com/questions/34843354/…
    • ehi scusate per tale ritardo della risposta, quindi, qual è il reale problema che si trovano ad affrontare ora?
    • in realtà voglio aggiornare il frammento , e davvero credo che questo eventbus è il modo migliore. così, circa rinfrescante , hai qualche tutorial?? grazie davvero
    • ufficiale github link per EventBus già l’esempio del campione così.. Ma penso che se si sta facendo tutto nel Frammento che ho.e utilizzando SwipeRefreshLayout, quindi non credo c’è alcun bisogno di usare EventBus
    • il mio frammento restituisce sempre null
    • assicurarsi che il viewpager adattatore di estensione FragmentPagerAdapter se si sta andando con la soluzione 1.

  2. 8

    Qui è il metodo che viene utilizzato da FragmentPagerAdapter per creare il Fragment‘s nome del tag:

    private static String makeFragmentName(int viewId, long id) {
        return "android:switcher:" + viewId + ":" + id;
    }

    viewId è l’id del ViewPager.

    id è la posizione del frammento all’interno del ViewPager.

    Esempio:

    String fragmentTag = makeFragmentName(myViewPager.getId(), 2);
    Fragment fragment = getSupportFragmentManager().findFragmentByTag(fragmentTag);
  3. 0

    Se questa domanda è già stato risposto. Ho un altro approccio per archiv. questo e questo potrebbe essere meglio uno come il modo in cui i frammenti sono codificati nel codice sono soggetti a cambiamento. Anche utilizzando un adattatore.getItem(posizione) non restituisce l’istanza di frammento essere visualizzato, verrà dipendono dalla nostra implementazione del metodo getItem.

    Quindi, Fondamentalmente, il problema è che non abbiamo l’istanza di Frammenti che sono presenti nel viewPager. L’idea è quella di eseguire l’override del metodo

    public Object instantiateItem(ViewGroup container, int position) {
        //If we already have this item instantiated, there is nothing
        //to do.  This can happen when we are restoring the entire pager
        //from its saved state, where the fragment manager has already
        //taken care of restoring the fragments we previously had instantiated.
        if (mFragments.size() > position) {
            Fragment f = mFragments.get(position);
            if (f != null) {
                return f;
            }
        }
    
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
    
        Fragment fragment = getItem(position);
        if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
        if (mSavedState.size() > position) {
            Fragment.SavedState fss = mSavedState.get(position);
            if (fss != null) {
                fragment.setInitialSavedState(fss);
            }
        }
        while (mFragments.size() <= position) {
            mFragments.add(null);
        }
        fragment.setMenuVisibility(false);
        fragment.setUserVisibleHint(false);
        mFragments.set(position, fragment);
        mCurTransaction.add(container.getId(), fragment);
    
        return fragment;
    }

    di FragmentStatePagerAdapter. Se guardiamo l’implementazione di default di questo metodo, è fondamentalmente il processo di creazione di un’istanza di nuova Frammenti, se non esiste e non restituirli. Anche le memorizza in una lista di frammenti, che è privato. Quindi quello che possiamo fare è eseguire l’Override di questo metodo e memorizzare le istanze in frammenti nel nostro elenco. Questo può essere implementato nel seguente modo

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    
        private ArrayList<Fragment> fragmentList;
    
        private final int NUM_PAGES;
    
        public ScreenSlidePagerAdapter(FragmentManager fm, int numPages) {
            super(fm);
            NUM_PAGES = numPages;
            fragmentList = new ArrayList<>(NUM_PAGES);
        }
    
        @Override
        public Fragment getItem(int position) {
            Fragment fragment = new CustomFragment();
            //this method can be modified according to the requirement
            return fragment;
        }
    
        @Override
        public int getCount() {
            return NUM_PAGES;
        }
    
        public Fragment getFragment(int position){
            return fragmentList.get(position);
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, int position){
            Fragment fragment = (Fragment) super.instantiateItem(container,position);
            if(fragmentList.size()<NUM_PAGES&&!fragmentList.contains(fragment)){
                fragmentList.add(fragment);
            }
            return fragment;
        }
    }

    Quindi avremo le istanze di tutti i frammenti disponibile con noi, non ci sarebbe stato più bisogno di nessun tag per trovare il frammento di istanze venga visualizzato all’utente.

Lascia un commento