Antworten:
Die Hauptantwort basiert auf einem Namen, der vom Framework generiert wird. Wenn sich das jemals ändert, wird es nicht mehr funktionieren.
Was ist mit dieser übergeordneten Lösung instantiateItem()
und destroyItem()
Ihrer Fragment(State)PagerAdapter
:
public class MyPagerAdapter extends FragmentStatePagerAdapter {
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return ...;
}
@Override
public Fragment getItem(int position) {
return MyFragment.newInstance(...);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
}
Dies scheint für mich zu funktionieren, wenn es um verfügbare Fragmente geht. Fragmente, die noch nicht instanziiert wurden, geben beim Aufruf null zurück getRegisteredFragment
. Aber ich habe dies hauptsächlich verwendet, um den Strom Fragment
aus dem ViewPager
: herauszuholen, adapater.getRegisteredFragment(viewPager.getCurrentItem())
und dies wird nicht zurückkehren null
.
Mir sind keine weiteren Nachteile dieser Lösung bekannt. Wenn es welche gibt, würde ich gerne wissen.
MyPagerAdapter
aufgrund des Lebenszyklus zerstört wird (dh sich dreht) und nicht registerdFragments
verloren geht? Muss die Activity
/ Fragment
using MyPagerAdapter
es speichern onSaveInstanceState
und dann mit der neuen FragmentManager
Referenz aktualisieren ?
getItem
beim Drehen nicht erneut aufgerufen wird (für bereits erstellte Frags), da der FragmentManager
Status des Fragments
im Pager enthaltenen Frags wiederhergestellt wird . Wenn instantiateItem
bei jeder Fragment
Wiederherstellung aufgerufen wird, ist diese Lösung tatsächlich sicherer und zukunftssicherer als meine oder die akzeptierte Antwort. Ich werde darüber nachdenken, es selbst zu versuchen.
Um Fragmente aus einem ViewPager zu holen, gibt es hier und in anderen verwandten SO-Threads / Blogs viele Antworten. Jeder, den ich gesehen habe, ist kaputt und scheint im Allgemeinen in einen der beiden unten aufgeführten Typen zu fallen. Es gibt einige andere gültige Lösungen, wenn Sie nur das aktuelle Fragment abrufen möchten, wie diese andere Antwort in diesem Thread.
Bei Verwendung FragmentPagerAdapter
siehe unten. Bei der Verwendung von FragmentStatePagerAdapter
seinem Wert bei der Suche dieses . Das Abrufen von Indizes, die nicht die aktuellen in einem FragmentStateAdapter sind, ist nicht so nützlich, da diese von Natur aus vollständig abgerissen werden und nicht mehr im Blickfeld / außerhalb der Grenzen von offScreenLimit liegen.
Falsch: Pflegen Sie Ihre eigene interne Liste von Fragmenten, die zum Zeitpunkt des Aufrufs hinzugefügt FragmentPagerAdapter.getItem()
wird
SparseArray
oderMap
getItem
es nur beim ersten Scrollen einer Seite genannt wird (oder erhalten wird, wenn Ihre ViewPager.setOffscreenPageLimit(x)
> 0 ist) ViewPager
, wird das interne gelöscht , wenn das Hosting Activity
/ beendet Fragment
oder neu gestartet SpaseArray
wird, wenn die benutzerdefinierte FragmentPagerActivity neu erstellt wird, aber hinter den Kulissen ViewPagers interne Fragmente werden neu erstellt, und getItem
werden nicht für einen des Indizes bezeichnet werden, so dass die Fähigkeit , ein Fragment aus dem Index erhalten wird für immer verloren sein. Sie können durch die Einsparung aus der Rechnung zu tragen und die Wiederherstellung dieser Fragmentverweise über FragmentManager.getFragment()
und putFragment
aber das beginnt chaotisch IMHO zu bekommen.Falsch: Erstellen Sie Ihre eigene Tag-ID, die mit der unter der Haube verwendeten übereinstimmt,FragmentPagerAdapter
und rufen Sie damit die Seitenfragmente aus derFragmentManager
ViewPager
das könnte jederzeit oder für jede Betriebssystemversion ändern.Die für diese Lösung neu erstellte Methode ist
private static String makeFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}
ViewPager.instantiateItem()
Ein ähnlicher Ansatz wie getItem()
oben, jedoch ohne Unterbrechung des Lebenszyklus, besteht darin, sich anzuschließen, instantiateItem()
anstatt, getItem()
wie der erstere jedes Mal aufgerufen wird, wenn dieser Index erstellt wird / auf den zugegriffen wird. Siehe diese Antwort
FragmentViewPager
Erstellen Sie Ihre eigene FragmentViewPager
Klasse aus der Quelle der neuesten Support-Bibliothek und ändern Sie die Methode, die intern zum Generieren der Fragment-Tags verwendet wird. Sie können es durch das folgende ersetzen. Dies hat den Vorteil, dass Sie wissen, dass sich die Tag-Erstellung niemals ändern wird und Sie sich nicht auf eine private API / Methode verlassen, was immer gefährlich ist.
/**
* @param containerViewId the ViewPager this adapter is being supplied to
* @param id pass in getItemId(position) as this is whats used internally in this class
* @return the tag used for this pages fragment
*/
public static String makeFragmentName(int containerViewId, long id) {
return "android:switcher:" + containerViewId + ":" + id;
}
Wenn Sie dann, wie das Dokument sagt, ein für einen Index verwendetes Fragment abrufen möchten, rufen Sie einfach so etwas wie diese Methode auf (die Sie in die benutzerdefinierte FragmentPagerAdapter
oder eine Unterklasse einfügen können ), wobei Sie sich bewusst sind, dass das Ergebnis möglicherweise null ist, wenn getItem noch nicht aufgerufen wurde Diese Seite wurde noch nicht erstellt.
/**
* @return may return null if the fragment has not been instantiated yet for that position - this depends on if the fragment has been viewed
* yet OR is a sibling covered by {@link android.support.v4.view.ViewPager#setOffscreenPageLimit(int)}. Can use this to call methods on
* the current positions fragment.
*/
public @Nullable Fragment getFragmentForPosition(int position)
{
String tag = makeFragmentName(mViewPager.getId(), getItemId(position));
Fragment fragment = getSupportFragmentManager().findFragmentByTag(tag);
return fragment;
}
Dies ist eine einfache Lösung und löst die Probleme in den beiden anderen Lösungen, die überall im Web zu finden sind
instantiateItem()
wenn Sie auf ein Fragment zugreifen möchten, das noch nicht besucht wurde, nachdem ein Lebenszyklusereignis stattgefunden hat und das vor dem Lebenszyklusereignis besucht wurde. Ein kleiner Unterschied, den ich kenne, der jedoch zu einem subtilen Fehler in meinem Programm geführt hat, weshalb ich mich damit befasse.
getItemId(pos)
drinnenFragmentStatePagerAdapter
Fügen Sie Ihrem FragmentPagerAdapter die nächsten Methoden hinzu:
public Fragment getActiveFragment(ViewPager container, int position) {
String name = makeFragmentName(container.getId(), position);
return mFragmentManager.findFragmentByTag(name);
}
private static String makeFragmentName(int viewId, int index) {
return "android:switcher:" + viewId + ":" + index;
}
getActiveFragment (0) muss funktionieren.
Hier ist die in ViewPager implementierte Lösung https://gist.github.com/jacek-marchwicki/d6320ba9a910c514424d . Wenn etwas fehlschlägt, wird ein gutes Absturzprotokoll angezeigt.
Eine weitere einfache Lösung:
public class MyPagerAdapter extends FragmentPagerAdapter {
private Fragment mCurrentFragment;
public Fragment getCurrentFragment() {
return mCurrentFragment;
}
//...
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
if (getCurrentFragment() != object) {
mCurrentFragment = ((Fragment) object);
}
super.setPrimaryItem(container, position, object);
}
}
setPrimaryItem()
es heißt, nachdem ViewPager.OnPageChangeListener#onPageSelected()
ich es nicht verwenden kann :-(
Ich weiß, dass dies einige Antworten hat, aber vielleicht hilft dies jemandem. Ich habe eine relativ einfache Lösung verwendet, als ich eine Fragment
von meiner bekommen musste ViewPager
. In Ihrem Activity
oder in Fragment
der ViewPager
Hand können Sie diesen Code verwenden, um alle Fragment
darin enthaltenen Daten zu durchlaufen .
FragmentPagerAdapter fragmentPagerAdapter = (FragmentPagerAdapter) mViewPager.getAdapter();
for(int i = 0; i < fragmentPagerAdapter.getCount(); i++) {
Fragment viewPagerFragment = fragmentPagerAdapter.getItem(i);
if(viewPagerFragment != null) {
// Do something with your Fragment
// Check viewPagerFragment.isResumed() if you intend on interacting with any views.
}
}
Wenn Sie die Position Ihres Fragment
in der kennen ViewPager
, können Sie einfach anrufen getItem(knownPosition)
.
Wenn Sie die Position Ihres Fragment
in nicht kennen ViewPager
, können Sie Ihre Kinder Fragments
eine Schnittstelle mit einer Methode wie implementieren lassen getUniqueId()
und diese verwenden, um sie zu unterscheiden. Oder Sie können alle durchlaufen Fragments
und den Klassentyp überprüfen, zif(viewPagerFragment instanceof FragmentClassYouWant)
!!! BEARBEITEN !!!
Ich habe festgestellt, dass getItem
nur von a aufgerufen wird, FragmentPagerAdapter
wenn jedes Fragment
beim ersten Mal erstellt Fragments
werden muss. Danach scheint es, dass die mit dem recycelt werden FragmentManager
. Auf diese Weise FragmentPagerAdapter
erstellen viele Implementierungen neue Fragment
s in getItem
. Mit meiner obigen Methode bedeutet dies, dass wir bei Fragment
jedem getItem
Aufruf neue s erstellen, wenn wir alle Elemente in der FragmentPagerAdapter
. Aus diesem Grund habe ich einen besseren Ansatz gefunden, indem FragmentManager
ich Fragment
stattdessen den verwendet habe , um jeden zu erhalten (unter Verwendung der akzeptierten Antwort). Dies ist eine vollständigere Lösung und hat für mich gut funktioniert.
FragmentPagerAdapter fragmentPagerAdapter = (FragmentPagerAdapter) mViewPager.getAdapter();
for(int i = 0; i < fragmentPagerAdapter.getCount(); i++) {
String name = makeFragmentName(mViewPager.getId(), i);
Fragment viewPagerFragment = getChildFragmentManager().findFragmentByTag(name);
// OR Fragment viewPagerFragment = getFragmentManager().findFragmentByTag(name);
if(viewPagerFragment != null) {
// Do something with your Fragment
if (viewPagerFragment.isResumed()) {
// Interact with any views/data that must be alive
}
else {
// Flag something for update later, when this viewPagerFragment
// returns to onResume
}
}
}
Und Sie werden diese Methode brauchen.
private static String makeFragmentName(int viewId, int position) {
return "android:switcher:" + viewId + ":" + position;
}
ViewPager
selbst setzt diese Tags. Diese Lösung ist fragil, da sie darauf beruht, die "versteckte" Namenskonvention der zu kennen ViewPager
. Die Antwort von Streets of Boston ist eine viel umfassendere Lösung, die ich jetzt in meinem Projekt verwende (anstelle dieses Ansatzes).
In meinem Fall hat keine der oben genannten Lösungen funktioniert.
Da ich jedoch den Child Fragment Manager in einem Fragment verwende, wurde Folgendes verwendet:
Fragment f = getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
Dies funktioniert nur, wenn Ihre Fragmente im Manager dem Viewpager-Element entsprechen.
Um das aktuelle sichtbare Fragment von ViewPager abzurufen . Ich benutze diese einfache Aussage und sie funktioniert gut.
public Fragment getFragmentFromViewpager()
{
return ((Fragment) (mAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem())));
}
Ich habe es geschafft, indem ich zuerst eine Liste aller Fragmente ( List<Fragment> fragments;
) erstellt habe, die ich verwenden wollte, und sie dann dem Pager hinzugefügt habe, um die Handhabung des aktuell angezeigten Fragments zu vereinfachen.
So:
@Override
onCreate(){
//initialise the list of fragments
fragments = new Vector<Fragment>();
//fill up the list with out fragments
fragments.add(Fragment.instantiate(this, MainFragment.class.getName()));
fragments.add(Fragment.instantiate(this, MenuFragment.class.getName()));
fragments.add(Fragment.instantiate(this, StoresFragment.class.getName()));
fragments.add(Fragment.instantiate(this, AboutFragment.class.getName()));
fragments.add(Fragment.instantiate(this, ContactFragment.class.getName()));
//Set up the pager
pager = (ViewPager)findViewById(R.id.pager);
pager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), fragments));
pager.setOffscreenPageLimit(4);
}
also dann kann dies genannt werden:
public Fragment getFragment(ViewPager pager){
Fragment theFragment = fragments.get(pager.getCurrentItem());
return theFragment;
}
Also könnte ich es in eine if-Anweisung stecken, die nur ausgeführt wird, wenn es sich auf dem richtigen Fragment befindet
Fragment tempFragment = getFragment();
if(tempFragment == MyFragmentNo2.class){
MyFragmentNo2 theFrag = (MyFragmentNo2) tempFragment;
//then you can do whatever with the fragment
theFrag.costomFunction();
}
Aber das ist nur mein Hack-and-Slash-Ansatz, aber er hat bei mir funktioniert. Ich verwende ihn, um relevante Änderungen an meinem aktuell angezeigten Fragment vorzunehmen, wenn die Zurück-Taste gedrückt wird.
Dies basiert auf der obigen Antwort von Steven. Dies gibt die tatsächliche Instanz des Fragments zurück, das bereits an die übergeordnete Aktivität angehängt ist.
FragmentPagerAdapter fragmentPagerAdapter = (FragmentPagerAdapter) mViewPager.getAdapter();
for(int i = 0; i < fragmentPagerAdapter.getCount(); i++) {
Fragment viewPagerFragment = (Fragment) mViewPager.getAdapter().instantiateItem(mViewPager, i);
if(viewPagerFragment != null && viewPagerFragment.isAdded()) {
if (viewPagerFragment instanceof FragmentOne){
FragmentOne oneFragment = (FragmentOne) viewPagerFragment;
if (oneFragment != null){
oneFragment.update(); // your custom method
}
} else if (viewPagerFragment instanceof FragmentTwo){
FragmentTwo twoFragment = (FragmentTwo) viewPagerFragment;
if (twoFragment != null){
twoFragment.update(); // your custom method
}
}
}
}
Ich konnte keinen einfachen, sauberen Weg finden, dies zu tun. Das ViewPager-Widget ist jedoch nur eine weitere ViewGroup, die Ihre Fragmente hostet. Der ViewPager hat diese Fragmente als unmittelbare untergeordnete Elemente. Sie können sie also einfach durchlaufen (mit .getChildCount () und .getChildAt ()) und prüfen, ob die gesuchte Fragmentinstanz derzeit in den ViewPager geladen ist, und einen Verweis darauf abrufen. Sie könnten beispielsweise ein statisches eindeutiges ID-Feld verwenden, um die Fragmente voneinander zu unterscheiden.
Beachten Sie, dass der ViewPager das gesuchte Fragment möglicherweise nicht geladen hat, da es sich um einen Virtualisierungscontainer wie ListView handelt.
FragmentPagerAdapter ist die Factory der Fragmente. Verwenden Sie Folgendes, um ein Fragment anhand seiner Position zu finden, wenn es sich noch im Speicher befindet:
public Fragment findFragmentByPosition(int position) {
FragmentPagerAdapter fragmentPagerAdapter = getFragmentPagerAdapter();
return getSupportFragmentManager().findFragmentByTag(
"android:switcher:" + getViewPager().getId() + ":"
+ fragmentPagerAdapter.getItemId(position));
}
Beispielcode für die v4-Support-API.
Sie müssen zu einem späteren Zeitpunkt keinegetItem()
andere Methode aufrufen , um die Referenz eines Fragment
gehosteten Inners abzurufen ViewPager
. Wenn Sie einige darin enthaltene Daten aktualisieren möchten, Fragment
verwenden Sie diesen Ansatz: ViewPager dynamisch aktualisieren?
Der Schlüssel besteht darin, neue Daten festzulegen Adaper
und aufzurufen, notifyDataSetChanged()
die wiederum aufrufen getItemPosition()
, Ihnen eine Referenz von Ihnen übergeben Fragment
und Ihnen die Möglichkeit geben, diese zu aktualisieren. Bei allen anderen Möglichkeiten müssen Sie sich auf sich selbst oder einen anderen Hack beziehen, was keine gute Lösung ist.
@Override
public int getItemPosition(Object object) {
if (object instanceof UpdateableFragment) {
((UpdateableFragment) object).update(xyzData);
}
//don't return POSITION_NONE, avoid fragment recreation.
return super.getItemPosition(object);
}
getItemPosition()
ist eine Methode in Ihrem Adapter. Sie werden es nicht direkt anrufen. Sie haben eine Referenz Ihres Adapters, also rufen Sie an, adapter.notifyDataSetChanged()
die wiederum getItemPosition()
Ihren Adapter aufruft, indem Sie die Referenz Ihres Fragment
s übergeben. Eine vollständige Implementierung in Aktion finden Sie hier stackoverflow.com/questions/19891828/…
Fragment
um eine Referenz zu aktualisieren, aber wie man eine Referenz erhält, ist umstritten. Andere Lösungen erhalten Referenz von FragmentManager
einer Zeichenfolge ähnelt der Verwendung "android:switcher:"+id
oder die Rückkehr POSITION_NONE
von getItemosition()
allen Fragmenten verursacht selbst neu zu erstellen.
Muss sich FragmentPagerAdapter
auf Ihre ViewPager-Adapterklasse erstrecken .
Wenn Sie verwenden, FragmentStatePagerAdapter
können Sie Ihre nicht Fragment
anhand ihrer findenID
public static String makeFragmentName(int viewPagerId, int index) {
return "android:switcher:" + viewPagerId + ":" + index;
}
So verwenden Sie diese Methode: -
Fragment mFragment = ((FragmentActivity) getContext()).getSupportFragmentManager().findFragmentByTag(
AppMethodUtils.makeFragmentName(mViewPager.getId(), i)
);
InterestViewFragment newFragment = (InterestViewFragment) mFragment;
Hey, ich habe diese Frage hier beantwortet . Grundsätzlich müssen Sie überschreiben
öffentliches Objekt instantiateItem (ViewGroup-Container, int-Position)
Methode von FragmentStatePagerAdapter.
Beste Lösung ist es, die Erweiterung verwenden wir erstellt bei Codepfad genannt SmartFragmentStatePagerAdapter . Wenn Sie dieser Anleitung folgen, wird das Abrufen von Fragmenten und des aktuell ausgewählten Fragments aus einem ViewPager erheblich vereinfacht. Außerdem kann der Speicher der im Adapter eingebetteten Fragmente besser verwaltet werden.
Der einfachste und prägnanteste Weg. Wenn alle Ihre Fragmente in ViewPager
verschiedenen Klassen sind, können Sie sie wie folgt abrufen und unterscheiden:
public class MyActivity extends Activity
{
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
if (fragment.getClass() == MyFragment.class) {
mMyFragment = (MyFragment) fragment;
}
}
}
Ich habe dies einfach mit einem etwas anderen Ansatz implementiert.
Meine benutzerdefinierte FragmentAdapter.getItem-Methode hat nicht neues MyFragment () zurückgegeben, sondern die Instanz von MyFragment, die im FragmentAdapter-Konstruktor erstellt wurde.
In meiner Aktivität habe ich dann das Fragment vom Adapter erhalten, überprüft, ob es eine Instanz des benötigten Fragments ist, und dann die erforderlichen Methoden umgewandelt und verwendet.
Erstellen Sie eine ganzzahlige Ressourcen-ID in /values/integers.xml
<integer name="page1">1</integer>
<integer name="page2">2</integer>
<integer name="page3">3</integer>
Dann in PagerAdapter getItem Funktion:
public Fragment getItem(int position) {
Fragment fragment = null;
if (position == 0) {
fragment = FragmentOne.newInstance();
mViewPager.setTag(R.integer.page1,fragment);
}
else if (position == 1) {
fragment = FragmentTwo.newInstance();
mViewPager.setTag(R.integer.page2,fragment);
} else if (position == 2) {
fragment = FragmentThree.newInstance();
mViewPager.setTag(R.integer.page3,fragment);
}
return fragment;
}
Schreiben Sie dann in der Aktivität diese Funktion, um die Fragmentreferenz zu erhalten:
private Fragment getFragmentByPosition(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = (Fragment) mViewPager.getTag(R.integer.page1);
break;
case 1:
fragment = (Fragment) mViewPager.getTag(R.integer.page2);
break;
case 2:
fragment = (Fragment) mViewPager.getTag(R.integer.page3);
break;
}
return fragment;
}
Rufen Sie die obige Funktion auf, um die Fragmentreferenz abzurufen, und wandeln Sie sie dann in Ihr benutzerdefiniertes Fragment um:
Fragment fragment = getFragmentByPosition(position);
if (fragment != null) {
FragmentOne fragmentOne = (FragmentOne) fragment;
}
Einfache Möglichkeit, Fragmente im Fragment-Manager zu durchlaufen. Suchen Sie den Viewpager mit dem Argument für die Abschnittsposition in der öffentlichen statischen PlaceholderFragment newInstance (int sectionNumber) .
public PlaceholderFragment getFragmentByPosition(Integer pos){
for(Fragment f:getChildFragmentManager().getFragments()){
if(f.getId()==R.id.viewpager && f.getArguments().getInt("SECTNUM") - 1 == pos) {
return (PlaceholderFragment) f;
}
}
return null;
}
Im Fragment
public int getArgument(){
return mPage;
{
public void update(){
}
In FragmentActivity
List<Fragment> fragments = getSupportFragmentManager().getFragments();
for(Fragment f:fragments){
if((f instanceof PageFragment)&&(!f.isDetached())){
PageFragment pf = (PageFragment)f;
if(pf.getArgument()==pager.getCurrentItem())pf.update();
}
}
In TabLayout gibt es mehrere Registerkarten für Fragment. Sie können das Fragment anhand des Index des Fragments anhand des Tags finden.
Zum Beispiel. Der Index für Fragment1 ist 0, also übergeben Sie in der findFragmentByTag()
Methode das Tag für den Viewpager. Nachdem Sie fragmentTransaction verwendet haben, das Sie hinzufügen können, ersetzen Sie das Fragment.
String tag = "android:switcher:" + R.id.viewPager + ":" + 0;
Fragment1 f = (Fragment1) getSupportFragmentManager().findFragmentByTag(tag);
Ok für den Adapter FragmentStatePagerAdapter
finanziere ich eine Lösung:
in Ihrer FragmentActivity:
ActionBar mActionBar = getSupportActionBar();
mActionBar.addTab(mActionBar.newTab().setText("TAB1").setTabListener(this).setTag(Fragment.instantiate(this, MyFragment1.class.getName())));
mActionBar.addTab(mActionBar.newTab().setText("TAB2").setTabListener(this).setTag(Fragment.instantiate(this, MyFragment2.class.getName())));
mActionBar.addTab(mActionBar.newTab().setText("TAB3").setTabListener(this).setTag(Fragment.instantiate(this, MyFragment3.class.getName())));
viewPager = (STViewPager) super.findViewById(R.id.viewpager);
mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), mActionBar);
viewPager.setAdapter(this.mPagerAdapter);
und erstellen Sie eine Methode in Ihrer Klasse FragmentActivity - Damit Sie mit dieser Methode auf Ihr Fragment zugreifen können, müssen Sie ihm nur die Position des gewünschten Fragments geben:
public Fragment getActiveFragment(int position) {
String name = MyPagerAdapter.makeFragmentName(position);
return getSupportFragmentManager().findFragmentByTag(name);
}
in Ihrem Adapter:
public class MyPagerAdapter extends FragmentStatePagerAdapter {
private final ActionBar actionBar;
private final FragmentManager fragmentManager;
public MyPagerAdapter(FragmentManager fragmentManager, com.actionbarsherlock.app.ActionBarActionBar mActionBar) {super(fragmentManager);
this.actionBar = mActionBar;
this.fragmentManager = fragmentManager;
}
@Override
public Fragment getItem(int position) {
getSupportFragmentManager().beginTransaction().add(mTchatDetailsFragment, makeFragmentName(position)).commit();
return (Fragment)this.actionBar.getTabAt(position);
}
@Override
public int getCount() {
return this.actionBar.getTabCount();
}
@Override
public CharSequence getPageTitle(int position) {
return this.actionBar.getTabAt(position).getText();
}
private static String makeFragmentName(int viewId, int index) {
return "android:fragment:" + index;
}
}
Fragment yourFragment = yourviewpageradapter.getItem(int index);
index
in - Adapter ist der Ort des Fragments wie Sie hinzugefügt fragment1
zuerst so retreive fragment1
Pass index
als 0 und so weiter für Ruhe
Fragment
in einWeakReference
zu wickeln, um zu garantieren, dass Sie nicht verhindern, dass ein zerstörtes Fragment Müll sammelt?