@@@@@@@@@@@@@@@@@@@@@@@@@@
EDITAR: Terminé sin implementar esta solución ya que hubo otros problemas que esto tiene. Square lanzó recientemente 2 bibliotecas que reemplazan los fragmentos. Yo diría que esta podría ser una alternativa mejor que intentar piratear fragmentos para que hagan algo que Google no quiere que hagan.
http://corner.squareup.com/2014/01/mortar-and-flow.html
@@@@@@@@@@@@@@@@@@@@@@@@@@
Pensé que pondría esta solución para ayudar a las personas que tengan este problema en el futuro. Si sigue la conversación de los carteles originales con otras personas y observa el código que publicó, verá que el cartel original finalmente llega a la conclusión de usar una animación no operativa en los fragmentos secundarios mientras anima el fragmento principal. Esta solución no es ideal, ya que le obliga a realizar un seguimiento de todos los fragmentos secundarios, lo que puede resultar engorroso cuando se utiliza un ViewPager con FragmentPagerAdapter.
Como utilizo Child Fragments en todas partes, se me ocurrió esta solución que es eficiente y modular (por lo que se puede quitar fácilmente) en caso de que alguna vez lo solucionen y esta animación no operativa ya no sea necesaria.
Hay muchas formas de implementar esto. Elegí usar un singleton, y lo llamo ChildFragmentAnimationManager. Básicamente, realizará un seguimiento de un fragmento secundario para mí en función de su padre y aplicará una animación no operativa a los niños cuando se le solicite.
public class ChildFragmentAnimationManager {
private static ChildFragmentAnimationManager instance = null;
private Map<Fragment, List<Fragment>> fragmentMap;
private ChildFragmentAnimationManager() {
fragmentMap = new HashMap<Fragment, List<Fragment>>();
}
public static ChildFragmentAnimationManager instance() {
if (instance == null) {
instance = new ChildFragmentAnimationManager();
}
return instance;
}
public FragmentTransaction animate(FragmentTransaction ft, Fragment parent) {
List<Fragment> children = getChildren(parent);
ft.setCustomAnimations(R.anim.no_anim, R.anim.no_anim, R.anim.no_anim, R.anim.no_anim);
for (Fragment child : children) {
ft.remove(child);
}
return ft;
}
public void putChild(Fragment parent, Fragment child) {
List<Fragment> children = getChildren(parent);
children.add(child);
}
public void removeChild(Fragment parent, Fragment child) {
List<Fragment> children = getChildren(parent);
children.remove(child);
}
private List<Fragment> getChildren(Fragment parent) {
List<Fragment> children;
if ( fragmentMap.containsKey(parent) ) {
children = fragmentMap.get(parent);
} else {
children = new ArrayList<Fragment>(3);
fragmentMap.put(parent, children);
}
return children;
}
}
A continuación, debe tener una clase que extienda Fragmento que se extiendan todos sus Fragmentos (al menos sus Fragmentos secundarios). Ya tenía esta clase y la llamo BaseFragment. Cuando se crea una vista de fragmentos, la agregamos al ChildFragmentAnimationManager y la eliminamos cuando se destruye. Puede hacer esto en Adjuntar / Separar u otros métodos de coincidencia en la secuencia. Mi lógica para elegir Crear / Destruir Vista fue porque si un Fragmento no tiene una Vista, no me importa animarlo para que se siga viendo. Este enfoque también debería funcionar mejor con ViewPagers que usan Fragments, ya que no hará un seguimiento de cada FragmentPagerAdapter que contiene un FragmentPagerAdapter, sino solo 3.
public abstract class BaseFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Fragment parent = getParentFragment();
if (parent != null) {
ChildFragmentAnimationManager.instance().putChild(parent, this);
}
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onDestroyView() {
Fragment parent = getParentFragment();
if (parent != null) {
ChildFragmentAnimationManager.instance().removeChild(parent, this);
}
super.onDestroyView();
}
}
Ahora que todos sus Fragmentos están almacenados en la memoria por el fragmento principal, puede llamar a animarlos de esta manera, y sus fragmentos secundarios no desaparecerán.
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ChildFragmentAnimationManager.instance().animate(ft, ReaderFragment.this)
.setCustomAnimations(R.anim.up_in, R.anim.up_out, R.anim.down_in, R.anim.down_out)
.replace(R.id.container, f)
.addToBackStack(null)
.commit();
Además, para que lo tenga, aquí está el archivo no_anim.xml que va en su carpeta res / anim:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/linear_interpolator">
<translate android:fromXDelta="0" android:toXDelta="0"
android:duration="1000" />
</set>
Nuevamente, no creo que esta solución sea perfecta, pero es mucho mejor que para cada instancia que tenga un fragmento secundario, implementando código personalizado en el fragmento principal para realizar un seguimiento de cada niño. He estado allí y no es divertido.
R.id.fragmentHolder
con respecto a A, A1, A2, etc.?