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.
Eso funciona para mí: http://stackoverflow.com/a/14505469/959086 intente implementar este código en su aplicación – Kenumir