studio navegar fragments entre eliminar destruir android opengl-es android-fragments glsurfaceview

navegar - eliminar fragment android



GLSurfaceView dentro de fragmento no se muestra cuando se reinicia (5)

Así es como tengo mi configuración de GLSurfaceView en un fragmento:

onCreateView() { glSurfaceView = new GLSurfaceView(getActivity()); ... } onPause() { if (glSurfaceView != null) { glSurfaceView.onPause(); } ... } onResume() { if (glSurfaceView != null) { glSurfaceView.onResume(); } ... }

}

Entonces, similar a lo que harías en una actividad. Esto funciona en mi caso de uso, así que parece que funcionan en fragmentos. Es difícil decir más sin saber cómo se ve tu código.

Tengo un GLSurfaceView configurado y renderizado como se esperaba usando un GLSurfaceView.Renderer . Mi aplicación utiliza fragmentos del paquete de soporte de Android. Cuando surfaceDestroyed hacia una nueva surfaceDestroyed fragmento, se llama surfaceDestroyed pero cuando vuelvo al fragmento a través de la backstack, GLSurfaceView no se GLSurfaceView , las llamadas a requestRender no dan como resultado una llamada onDraw .

Soy consciente de que necesito llamar a onResume y onPause en la vista de superficie y estoy haciendo esto desde el fragmento de alojamiento, pero no parece resolver el problema. Todos los ejemplos sobre este método se refieren a la actividad, ¿podría ser este el problema? Y si es así, ¿cómo se usa un GLSurfaceView dentro de un fragmento?

Cualquier idea muy apreciada, me complace publicar el código, pero parece ser una pregunta más general para mí,

Gracias


Hay un par de cosas que debe tener en cuenta al usar fragmentos con una vista de la superficie del escritorio. Se pone un poco complicado pero quédate conmigo. Cuando navega hacia un nuevo fragmento, ondestroyview se invoca automáticamente en su fragmento con la vista de la galería de diapositivas, que destruye su vista (la vista de la galería de gráficos que creó y devolvió en la vista de creación).

Por lo tanto, cuando navega hacia un nuevo fragmento, a continuación, se activa onpause, onstop, ondestroyview automáticamente, sin ningún trabajo de su parte. cuando vuelves a ese fragmento con la vista de la superficie del gráfico, luego se crea la vista en una escena, se crea laactividad, se inicia y se llama al contenido automáticamente, sin ningún trabajo de tu parte.

La clave de su pregunta es comprender el ciclo de vida del fragmento que se puede encontrar en el sitio web del desarrollador de Android, y comprender cómo funciona también glsurfaceview.

Ahora, usando la vista de la superficie de Gls, debe implementar el renderizador, utilizando onsurfacecreated, onsurfacechanged, y ondrawframe. Navegar hacia otro fragmento y luego regresar a tu fragmento con la vista de la superficie del árbol provocará que se vuelva a llamar a una superficie creada, ya que tu vista de la superficie del mapa fue destruida en una vista destructora, tu contexto se perdió y necesitas volver a cargar todos tus recursos en la cadena de caracteres.

Por último, por su pregunta, parece que no se está llamando a ondrawframe, lo que probablemente se deba a que usted no recrea su vista, no establece el renderizador y devuelve su vista de oncreateview.

así que en una vista múltiple necesitas algo como esto

@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); //return your view here return mView; } @Override public void onActivityCreated(Bundle mState) { super.onActivityCreated(mState); //setting your renderer here causes onSurfaceCreated to be called //if you set your renderer here then you have a context to load resources surface.setRenderer( shader ); }

No desea crear su clase de representación (sombreado) en la vista de creación a menos que desee que su clase de representación ''vuelva a comenzar'' cada vez que vuelva a su fragmento con la vista de la superficie del gráfico. En lugar de eso, crea tu clase de representación en tus Fragmentos en Creación, de esta manera, si tienes las cosas configuradas, comenzarás justo donde lo dejaste, ya que el simple hecho de establecer el renderizador te proporcionará la superficie que provocará la invocación de la superficie creada, el cambio de superficie y el marco anterior. automáticamente. Asegúrese de volver a cargar los recursos que utilizó por última vez en una superficie creada, en el marco anterior antes de dibujarlos.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); shader = new Shader(this); Log.d("Fragment", "OnCreate"); }

cuando se trata de pausar y reanudar su fragmento, en la mayoría de los casos esto se maneja automáticamente cuando reemplaza dinámicamente un fragmento y lo agrega al backstack, así que simplemente coloque surface.onpause () y surface.onResume () en los lugares correctos y eres bueno para ir.

Para aclarar las cosas intente poner declaraciones de registro en los métodos que giran en torno al ciclo de vida del fragmento y el renderizador glsurfaceview y podrá ver qué está sucediendo y qué no.


No soy un experto con OpenGL ES , pero he luchado mucho por los fragmentos y su ciclo de vida. Lo que sugiero que hagas es configurarCreateView para tu fragmento, decirle al renderizador que comience a dibujar nuevamente, y si eso no funciona, intenta hacerlo desde el onResume del fragmento. No debería haber necesidad de hacer nada desde el nivel de actividad cuando se trata del dibujo de la superficie GL en el fragmento.


No trabajo con fragmentos, pero si se destruyó la superficie de Glsurface, quizás tenga que crear una instancia de OpenGLRenderer y volver a instalarla en la superficie de Glsurface, este código funciona para mí en actividades cuando cambio de orientación y vuelvo a crear toda la pantalla, en este caso tengo que configure de nuevo la vista de contenido del diseño para restablecer la vista de la galería de gráficos:

view.onPause(); setContentView(R.layout.slidegl); view = (GLSurfaceView) this.findViewById(R.id.glSurface); renderer = new OpenGLRenderer(); view.setRenderer(renderer); view.onResume();

Si no quieres reiniciar y configurar todo el contenido de la vista, intenta crear un nuevo objeto de GLSurface:

this.view = new GLSurfaceView();


Sé que es demasiado tarde, pero puede ser útil para otros Esta es mi respuesta, ya que ya lo he implementado y funciona bien tanto en el emulador como en el dispositivo. Tengo fragmento de uso y soporte. Espero que te guste.

import android.opengl.GLSurfaceView; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.example.opengles20.glsurfaceview.GlSurfaceViewClass; import com.example.opengles20.renderer.RendererClass; public class MYGlclass extends Fragment { private GlSurfaceViewClass mGLView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) { return null; } View view=inflater.inflate(R.layout.main, container, false); mGLView=(GlSurfaceViewClasss)view.findViewById(R.id.gl_surface_view); mGLView.setEGLContextClientVersion(2); RendererClass rendererclass=new RendererClass(getActivity()); mGLView.setRenderer(rendererclass); mGLView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); return view; } }