2015-07-04 4 views
5

Ich verwende Viewpager und Actionbar Tabs (4 Tabs). Wenn die Main-Aktivität gestartet wird, werden die 4 Fragmentdaten geladen.Wie lade ich die Fragment-Aktivität oncreate() -Methode der ausgewählten Aktionsleiste nur, wenn die Registerkarte ausgewählt ist?

Wie kann man nur die ausgewählten Tabdaten laden?

Auch wenn ich Tab 1, Tab1 und Tab0 lädt.

Wenn ich zwischen tab0 und tab1 wische, wird onstart() für beide Registerkarten nicht aufgerufen.

Wenn ich Tab2 wähle und dann tab0, onstart() für tab0 lädt.

Wenn ich zwischen tab2 und tab3 wische, onstart() für beide nicht aufgerufenen Registerkarten.

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]; 
} 

}

fand ich diesen Link, aber es ist nicht hilfreich link

+1

So funktioniert der pagerAdapter, Sie müssen Ihre eigene Logik korrigieren, um dies zu verhindern, wie booleschen Wert für vier Fragmente nehmen und sie aktivieren, wenn die Registerkarte ausgewählt ist. Und laden Sie Fragmente basierend auf TRUE oder FALSE. –

+0

Ich habe das versucht, aber das Problem ist, dass, wenn ich eine Registerkarte auswählen, ihre Fragment-Aktivität onresume() oder oncreate nicht aufgerufen wird. – Mohammad

Antwort

1

Ich habe das Problem gelöst.

Ich habe eine statische Variable erstellt, um den ausgewählten Registerindex zu speichern.

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

Seit Viewpager die ausgewählte Seite und die linke Seite und die rechte Seite laden, wenn sie jedes Mal, wenn die Seite geändert existiert, so dass ich diese Funktion außer Kraft setzen zu überprüfen, ob dieses Fragment das ein sichtbar Benutzer und rufen Sie dann onResume Methode.

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

hinzufügen zu diesem ich werde sagen onResume() nicht direkt aufrufen, was auch immer Sie in Ihrem onesume haben, setzen Sie eine Methode ein und rufen Sie das lieber an, und rufen Sie auch diese Methode in Ihrem onresume, so funktioniert es normal – Elltz

+0

Bitte rufen Sie onResume nicht auf(), es ist eine Methode, die bereits von Android aufgerufen wird und sollte für das System reserviert werden. Sie riskieren, dass Ihr Fragment in einem inkonsistenten Zustand ist, wenn Sie diese Methoden aufrufen. –

1

Mit ViewPager erweitere ich immer Fragment setMenuVisibility(). Es wird mit true aufgerufen, wenn das Fragment sichtbar ist, und mit false wenn es nicht ist. Wenn es sichtbar ist, können Sie alle erforderlichen Aktionen ausführen.

Verwandte Themen