2015-07-04 11 views
5

Utilizzo schede viewpager e barra delle azioni (4 schede). All'avvio dell'attività principale, carica i 4 dati dei frammenti.Come caricare il metodo di attività del frammento sucreate() della scheda selezionata nella barra delle azioni solo se la scheda è selezionata?

come fare a caricare solo i dati di tabulazione selezionati?

Inoltre, quando si seleziona la scheda 1, vengono caricati tab1 e ​​tab0.

Se faccio scorrere da tab0 a tab1, onstart() per entrambe le schede non chiamate.

Se si seleziona la scheda 2 e quindi si seleziona la scheda 0, onstart() per i carichi della tabella0.

Se si scorre tra Tab2 e Tab3, onstart() per entrambe le schede non chiamate.

MainActivity.java

MainPagerAdapter tabsPagerAdapter; 
ViewPager viewPager; 
ActionBar actionBar; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    viewPager = (ViewPager) findViewById(R.id.pager); 
    tabsPagerAdapter = new MainPagerAdapter(getSupportFragmentManager()); 
    viewPager.setAdapter(tabsPagerAdapter); 

    actionBar = getSupportActionBar(); 
    actionBar.setHomeButtonEnabled(false); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 


    actionBar.addTab(actionBar.newTab().setIcon(getResources().getDrawable(R.drawable.doros)).setTabListener(this)); 
    actionBar.addTab(actionBar.newTab().setIcon(getResources().getDrawable(R.drawable.esteshara)).setTabListener(this)); 
    actionBar.addTab(actionBar.newTab().setIcon(getResources().getDrawable(R.drawable.aswak)).setTabListener(this)); 
    actionBar.addTab(actionBar.newTab().setIcon(getResources().getDrawable(R.drawable.akhbar)).setTabListener(this)); 


    viewPager.setOffscreenPageLimit(0); 


    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
    getSupportActionBar().setCustomView(R.layout.abs_layout); 
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     @Override 
     public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 

    viewPager.setCurrentItem(3); 



} 

@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
    viewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { 

} 


@Override 
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { 

} 

MainPageAdapter.java

public class MainPagerAdapter extends FragmentPagerAdapter implements PagerSlidingTabStrip.IconTabProvider{ 

public MainPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 

@Override 
public int getCount() { 
    return 4; 
} 

private int[] tabIcons = { 
     R.drawable.ar, 
     R.drawable.ar, 
     R.drawable.ar, 
     R.drawable.ar 
}; 



@Override 
public android.support.v4.app.Fragment getItem(int position) { 
    switch (position) 
    { 
     case 3: return new NewsFragment(); 
     case 1: return new ConsultationFragment(); 
     case 2: return new IndecesFragment(); 
     case 0: return new LessonsFragment(); 
     default: return null; 
    } 
} 



@Override 
public int getPageIconResId(int i) { 
    return tabIcons[i]; 
} 

}

ho trovato questo link, ma la sua non è utile link

+1

Questo è il modo in cui funziona il pagerAdapter, è necessario correggere la propria logica per impedirlo, ad esempio prendere il valore booleano per quattro frammenti e abilitarli quando la scheda è selezionata. E carica i frammenti in base a TRUE o FALSE. –

+0

L'ho provato, ma il problema è che quando seleziono una scheda, la sua attività frammento su resume() o oncreate non viene chiamata. – Mohammad

risposta

1

ho risolto il problema.

Ho creato una variabile statica per memorizzare l'indice di tabulazione selezionato.

@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
    sharedVariables.setSelectedTab(tab.getPosition()); 

Poiché Viewpager carica la pagina selezionata e la pagina sinistra e giusta pagina se esistono ogni volta che la pagina è cambiato, quindi ignorare questa funzione per verificare se questo frammento è quello visibile all'utente e quindi chiamare onResume metodo.

@Override 
public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
    if (isVisibleToUser) { 
      onResume(); 
    } else { 
     // Do your Work 
    } 
} 
+1

per aggiungere a questo dirò non chiamare onResume() direttamente ciò che mai hai nel tuo onresume metti un metodo e chiamalo piuttosto, e chiama anche quel metodo nel tuo onresume in modo che funzioni normalmente – Elltz

+0

Per favore, non chiamare su Riprendi(), è un metodo già chiamato da Android e dovrebbe essere riservato al sistema. Rischiate di avere il vostro frammento in uno stato incoerente se chiamate questi metodi. –

1

Con ViewPager estendo sempre il frammento setMenuVisibility(). Viene chiamato con true quando il frammento è visibile e con false quando non lo è. Quando è visibile, puoi eseguire tutte le azioni necessarie.

Problemi correlati