2016-12-03 5 views
0

Ich habe eine Tablayout innerhalb meiner MainActivity und eine Viewpager, die drei Fragmente zeigt.Wie funktioniert TabLayout?

Wenn die App startet, geschieht dies:

onCreate Fragment 1 
onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 
onActivityCreated Fragment 2 
onResume Fragment 2 

Dies geschieht, wenn den zweiten Registerkarte tippen:

onCreate Fragment 1 
onActivityCreated Fragment 3 
onResume Fragment 3 

den dritten Registerkarte Tapping:

onSaveInstanceState Fragment 1 

auf dem zweiten Registerkarte Tapping aus der dritten Registerkarte:

-Code

public class ViewPagerAdapter extends FragmentStatePagerAdapter { 

private final List<Fragment> mFragmentList = new ArrayList<>(); 
private final List<String> mFragmentTitleList = new ArrayList<>(); 

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

@Override 
public Fragment getItem(int position) { 
    return mFragmentList.get(position); 
} 

@Override 
public int getCount() { 
    return mFragmentList.size(); 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    return mFragmentTitleList.get(position); 
} 

public void addFragment(Fragment fragment, String title) { 
    mFragmentList.add(fragment); 
    mFragmentTitleList.add(title); 
} 
} 

In MainActivity

 viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tablayout); 
    tabLayout.setupWithViewPager(viewPager); 
} 

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(DishFragment.newInstance(1), "Кулинария"); 
    adapter.addFragment(DishFragment.newInstance(2), "Кондитерская"); 
    adapter.addFragment(DishFragment.newInstance(3), "Хлебобулочная"); 
    viewPager.setAdapter(adapter); 
} 

 
onCreate Fragment 1 
onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 
onActivityCreated Fragment 2 
onResume Fragment 2 

onCreate Fragment 1 
onActivityCreated Fragment 3 
onResume Fragment 3 

onSaveInstanceState Fragment 1 

onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 
+0

ViewPager standardmäßig das aktuelle Fragment und die benachbarten Fragmente zu laden. Ich bin mir nicht sicher, ob das ist, was Sie fragen, obwohl –

Antwort

1

ViewPager hält die benachbarten Fragmente im Speicher für eine schnelle Übergänge zwischen den Seiten. Ich denke, es gibt ein Update für die neu erstellten Fragmente (da Sie sie in einer Liste speichern, fügen Sie hinzu, dass Sie sie nicht mehr als einmal selbst erstellen).

Wenn App diesen Prozess gestartet passiert:

ich über den verdoppelten onCreate # 1 bin nicht sicher, aber Fragment 1 und 2 sind

onCreate Fragment 1 
onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 
onActivityCreated Fragment 2 
onResume Fragment 2 

Dies geschieht gestartet, wenn Klopfen am zweiten Hahn:

Fragment 1 & 2 wurden bereits erstellt, aber Fragment 3 ist jetzt

erstellt
onCreate Fragment 1 
onActivityCreated Fragment 3 
onResume Fragment 3 

Tapping an der dritten Hahn:

Das OS muss nicht 1 mehr

onSaveInstanceState Fragment 1 
auf Fragment halten

Auf den zweiten Abgriff vom dritten Abgriff tippen:

Fragment 1 erstellt wird/Wiederaufnahme

onCreate Fragment 1 
onActivityCreated Fragment 1 
onResume Fragment 1 
+0

Ok ich sehe! Aber ich habe ein anderes Missverständnis gefunden. Ich verwende eine Fragmentklasse für alle drei Registerkarten. Und es scheint, dass Elemente für das nächste Fragment über die vorherigen Elemente hinzufügen. Obwohl ich drei verschiedene Instanzen des Fragments erstellt hatte. Ist es in XML-Problem? Vielleicht ist es notwendig, es zu löschen? –

+0

Sie haben nur 3 'adapter.addFragment'. Ich bin mir nicht sicher, was Sie fragen –

+0

Das Problem wurde von selbst gelöst. Ich habe nichts realisiert 'adapter = new ViewPagerAdapter (getSupportFragmentManager()); adapter.addFragment (DishFragment.newInstance (1), "Кулинария"); adapter.addFragment (DishFragment.newInstance (2), "Кондитерская"); adapter.addFragment (DishFragment.newInstance (3), "Хлебобулочная"); viewPager.setAdapter (Adapter); ' –