Un couple de choses que vous devez réaliser lors de l'utilisation de fragments avec une glsurfaceview. Ça devient un peu délicat, mais rester avec moi. Lorsque vous accédez à un nouveau fragment, ondestroyview est appelée sur votre fragment avec le glsurfaceview automatiquement, ce qui détruit votre point de vue (la glsurfaceview que vous avez créé et est retourné dans oncreateview).
Ainsi, lorsque vous accédez à un nouveau fragment puis onpause, onstop, ondestroyview est appelée automatiquement, sans aucun travail de votre part. lorsque vous revenez à ce fragment avec le glsurfaceview puis oncreateview, onactivitycreated, onstart et onresume est appelée automatiquement, sans aucun travail de votre part.
La clé de votre question est de comprendre le fragment du cycle de vie qui peut être trouvé à l'android développeur de site web, et de comprendre comment glsurfaceview fonctions.
Maintenant, à l'aide de la glsurfaceview vous avez à mettre en œuvre la fonctionnalité de rendu, à l'aide de onsurfacecreated, onsurfacechanged, et ondrawframe. L'accès à un autre fragment, puis revenir à votre fragment avec le glsurfaceview entraînera onsurfacecreated être appelée de nouveau, depuis votre glsurfaceview a été détruit dans ondestroyview, votre contexte a été perdu et vous avez besoin de recharger toutes vos ressources sur le gl fil.
Enfin, il semble de votre question que ondrawframe n'est pas appelée, ce qui est probablement en raison pour vous de ne pas recréer de votre point de vue, réglez le moteur de rendu, et le retour de votre point de vue de oncreateview.
ainsi, dans oncreateview vous besoin de quelque chose comme cela
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState)
{
View mView = inflater.inflate(R.layout.fragment_layout, null);
surface = (GLSurfaceView) mView.findViewById (R.id.glsurfaceview);
surface.setEGLContextClientVersion(2);
//set the renderer here, important or ondrawframe will not be called!
surface.setRenderer( shader );
//you may need to configure rendermode here
//return your view here
return mView;
}
Vous ne voulez pas créer votre classe de rendu (shader) dans oncreateview, sauf si vous voulez que votre classe de rendu de "recommencer" à chaque fois que vous revenez à votre fragment avec le glsurfaceview. Au lieu de créer votre classe de rendu dans vos Fragments onCreate, de cette façon, si vous avez des choses mis en place puis vous allez commencer à exactement où vous avez quitté depuis le simple réglage, le moteur de rendu sera de vous fournir avec la surface qui sera la cause de la onsurfacecreated, onsurfacechanged, et ondrawframe être invoquée automatiquement. Assurez-vous de recharger toutes les ressources que vous avez été le dernier à onsurfacecreated, dans le ondrawframe avant de les dessiner.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
shader = new Shader(this);
Log.d("Fragment", "OnCreate");
}
quand il s'agit de la suspension et la reprise de votre fragment, puis dans la plupart des cas, cela est géré automatiquement lorsque vous remplacer dynamiquement un fragment et l'ajouter à la backstack, il suffit donc simplement de mettre de la surface.onpause() et de la surface.onResume() dans les bons endroits et vous êtes bon pour aller.
Pour rendre les choses limpides, essayez de mettre du journal des déclarations dans les méthodes tournant autour de l'fragment du cycle de vie et glsurfaceview moteur de rendu et vous serez en mesure de voir ce qui est et n'est pas le cas.