5

Estoy usando Google API 8 (Android 2.2) con paquetes v4.ViewPager dentro de Fragment desaparecer después de transaction.remove() (¿Mantener instancia?)

Hola, aquí está mi problema:

Tengo un FragmentActivity que tiene un menú que siempre permanece en la pantalla y un pequeño recipiente (un FrameLayout) cuando un pongo muchos fragmentos. Mi aplicación funciona bien cuando me estoy escondiendo y mostrando fragmentos pero se cuelga después de cargar todos los fragmentos porque tengo una memoria limitada para usar. En este caso, tuve que eliminar algunos de los fragmentos al cargar otros, por lo que la aplicación no falla. Pero aquí viene otro problema, mis localizadores no se vuelven a cargar después de que los elimine, todos los demás fragmentos funcionan bien. Solo mis buscapersonas no se muestran, no se cuelgan, solo desaparecen. Aquí va algo de código para darle una idea de lo que mi problema es acerca de:

MyFragmentActivity.java tiene esta disposición:

<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> 

En ese FrameLayout, puse todos mis fragmentos. Los fragmentos de buscapersonas es uno de ellos y su diseño se parece a:

<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> 

Y implementan esta clase abstracta 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(); 

} 

Este utiliza mi PagerAdapter que se parece a:

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

Ahora, implemente mi AbstractPagerFrag ción:

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

bien, ahora lo añado de mi contenido (FrameLayout) así (myFragment es un PagerFragment y myTag es una cadena que representa la etiqueta definida por mí):

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(); 

Y así es como lo quito:

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

Pero cuando se debe cargar de nuevo después de navegar de vuelta al fragmento en el menú, utilizando el mismo método que utilicé en el primer tiempo (código de abov e), el localizador ya no se muestra. ¿Alguien puede resolver esto?

Si lee todo esto, gracias, usted es un campeón.

+0

Eso funciona para mí: http://stackoverflow.com/a/14505469/959086 intente implementar este código en su aplicación – Kenumir

Respuesta

0

En realidad, si desea implementar ViewPager con fragmentos, debe agregar un TabHost, un TabWidget un FrameLayout y un ViewPager.

El TabHost será el contenedor para una vista de ventana con pestañas. Este objeto tiene dos hijos: un conjunto de etiquetas con pestañas en las que el usuario hace clic para seleccionar una pestaña específica, y FrameLayout es un objeto que muestra el contenido de esa página. Y después de que usted tiene que crear un TabAdapter (que es algo así como su PagerAdapter), y añadir los fragmentos para cada ficha llamando mTabsAdapter.addTab y el envío del Fragmento como parámetro

hice un post about it, donde explico cómo integrar fragmentos y ViewPager. Espero eso ayude.

+0

¿Por qué necesita agregar un TabHost? Tu publicación no entró en por qué es necesaria. – Jeremy

Cuestiones relacionadas