5

Ich benutze Google API 8 (Android 2.2) mit v4-Paketen.ViewPager innerhalb Fragment verschwinden nach transaction.remove() (Instanz beibehalten?)

Hallo, hier ist mein Problem:

ich ein FragmentActivity habe, die ein Menü hat, das immer auf dem Bildschirm bleibt und einen kleinen Behälter (a FrameLayout), wo ein mir viele Fragmente setzen. Meine Anwendung funktioniert gut, wenn ich Fragmente verstecke und zeige, aber sie stürzt ab, nachdem ich alle Fragmente geladen habe, weil ich nur einen begrenzten Speicher habe. In diesem Fall musste ich einige der Fragmente entfernen, wenn andere geladen wurden, sodass die Anwendung nicht abstürzte. Aber hier kommt ein anderes Problem, mein Pager lädt nicht neu, nachdem ich sie entfernt habe, alle anderen Fragmente funktionieren gut. Nur meine Pager werden nicht angezeigt, sie stürzen nicht ab, verschwinden einfach. Hier einige Code geht Ihnen einen Anhaltspunkt zu geben, was mein Problem ist, etwa:

MyFragmentActivity.java hat dieses Layout:

<LinearLayout 

     ...(some code from menu that doesn't matter) 

     <FrameLayout 
      android:id="@+id/content" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 
     </FrameLayout> 
    </LinearLayout> 

In diesem FrameLayout, ich habe alle meine Fragmente. Das Pager-Fragment ist einer von ihnen und ihre Anordnung wie folgt aussieht:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <android.support.v4.view.ViewPager 
     android:id="@+android:id/some_pager" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
</LinearLayout> 

Und ich implementiert diese abstrakte Klasse AbstractPagerFragment:

import java.util.List; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public abstract class AbstractPagerFragment extends Fragment { 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 

     View fragment = inflater.inflate(getLayoutID(), container,false); 
     PagerAdapter mPagerAdapter = initializePager(); 
     ViewPager pager = (ViewPager) fragment.findViewById(getPagerID()); 
     pager.setAdapter(mPagerAdapter); 
     return fragment; 
    } 

    private PagerAdapter initializePager() { 
     PagerAdapter mPagerAdapter = new templateDigital.util.PagerAdapter(getFragmentManager(), getFragments()); 
     return mPagerAdapter; 

    } 

    public abstract List<Fragment> getFragments(); 

    public abstract int getLayoutID(); 

    public abstract int getPagerID(); 

} 

Dies nutzt meinen PagerAdapter, die wie folgt aussieht:

import java.util.List; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

public class PagerAdapter extends FragmentPagerAdapter{ 

    private List<Fragment> fragments; 

    public PagerAdapter(FragmentManager fManager, List<Fragment> fragments) { 
     super(fManager); 
     this.fragments = fragments; 
    } 


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


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

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 
} 

Jetzt implementieren wir meine AbstractPagerFrag ment:

import templateDigital.main.R; 
import templateDigital.util.fragments.AbstractPagerFragment; 
import templateDigital.util.fragments.GenericFragment; 
import android.support.v4.app.Fragment; 

public class ConcretePagerFragment extends AbstractPagerFragment { 

    private List<Fragment> fragments; 

    public ConcretePagerFragment() { 
     fragments = new ArrayList<Fragment>(); 
     fragments.add(new GenericFragment(R.layout.concept_page1_fragment)); 
     fragments.add(new GenericFragment(R.layout.concept_page2_fragment)); 
     fragments.add(new GenericFragment(R.layout.concept_page3_fragment)); 

     //GenericFragments is a class that extends Fragments and just inflate a layout with a background image. 
    } 

    @Override 
    public List<Fragment> getFragments() { 
     return fragments; 
    } 

    @Override 
    public int getLayoutID() { 
     return R.layout.pager_fragment; 
    } 

    @Override 
    public int getPagerID() { 
     return R.id.some_pager; // the pager inside the layout 
    } 
} 

Okay, jetzt füge ich es von meinem Gehalt (FrameLayout) wie folgt aus (myFragment ist ein PagerFragment und MyTag ist ein String, dessen Tag von mir definiert darstellt):

FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    if (fragmentManager.findFragmentByTag(myTag) == null) { 
     transaction.add(R.id.content,myFragment, myTag); 
    } 

    transaction.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); 
    hideAllOtherFragments(myTag, transaction); //Here I hide all other fragments, the code is okay. Trust me. 
    transaction.show(myFragment()); 
    transaction.commit(); 

Und das ist, wie ich es entfernen:

... 
transaction.remove(myFragment); 
... 

Aber wenn es sollte wieder geladen werden, nachdem ich im Menü auf das Fragment zurück navigieren, mit der gleichen Methode ich in der ersten Zeit (Code abov verwendet e), der Pager wird nicht mehr angezeigt. Kann das jemand lösen?

Wenn Sie all dies lesen, danke, Sie sind ein Champion.

+0

Das funktioniert für mich: http://Stackoverflow.com/a/14505469/959086 Versuchen Sie, diesen Code in Ihrer App zu implementieren – Kenumir

Antwort

0

Wenn Sie ViewPager mit Fragmenten implementieren möchten, sollten Sie einen TabHost, ein TabWidget, ein FrameLayout und einen ViewPager hinzufügen.

Der TabHost ist der Container für eine Fensteransicht mit Registerkarten. Dieses Objekt enthält zwei untergeordnete Elemente: eine Gruppe von Registerkartenbeschriftungen, auf die der Benutzer klickt, um eine bestimmte Registerkarte auszuwählen, und FrameLayout ist ein Objekt, das den Inhalt dieser Seite anzeigt. Und nachdem Sie eine TabAdapter zu schaffen haben (das ist so etwas wie Ihr PagerAdapter), und fügen Sie die Fragmente für jeden Reiter durch mTabsAdapter.addTab Aufruf und Senden des Fragment als Parameter

ich post about it gemacht, wo ich erklären, wie Fragmente zu integrieren und ViewPager. Ich hoffe es hilft.

+0

Warum müssen Sie einen TabHost hinzufügen? In deinem Beitrag wurde nicht genau erklärt, warum es erforderlich ist. – Jeremy