glsurfaceview でフラグメントを使用する場合、いくつかのことを理解する必要があります。少しトリッキーになりますが、私と一緒にいてください。新しいフラグメントに移動すると、glsurfaceview を使用して ondestroyview がフラグメントで自動的に呼び出され、ビュー (作成して oncreateview で返された glsurfaceview) が破棄されます。
そのため、新しいフラグメントに移動すると、onpause、onstop、ondestroyview が自動的に呼び出されます。何もしなくてもかまいません。glsurfaceview を使用してそのフラグメントに戻ると、oncreateview、onactivitycreated、onstart、および onresume が自動的に呼び出されます。ユーザーの作業は必要ありません。
あなたの質問の鍵は、Android 開発者の Web サイトで見つけることができるフラグメントのライフサイクルを理解し、glsurfaceview がどのように機能するかを理解することです。
次に、glsurfaceview を使用して、onsurfacecreated、onsurfacechanged、および ondrawframe を使用してレンダラーを実装する必要があります。別のフラグメントに移動してから、glsurfaceview でフラグメントに戻ると、onsurfacecreated が再度呼び出されます。これは、glsurfaceview が ondestroyview で破棄され、コンテキストが失われ、gl スレッドですべてのリソースをリロードする必要があるためです。
最後に、あなたの質問から、ondrawframe が呼び出されていないように見えます。これはおそらく、ビューを再作成せず、レンダラーを設定し、oncreateview からビューを返さないためです。
oncreateview では、このようなものが必要です
@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 );
}
glsurfaceview でフラグメントに戻るたびにレンダリング クラスを「最初からやり直す」場合を除き、oncreateview でレンダリング クラス (シェーダー) を作成する必要はありません。代わりに Fragments onCreate でレンダリング クラスを作成します。設定が完了している場合は、レンダラーを設定するだけで onsurfacecreated、onsurfacechanged、および ondrawframe が呼び出されるサーフェスが提供されるため、左の場所から開始できます。自動的。onsurfacecreated で最後に使用していたリソースを、描画する前に ondrawframe で必ず再読み込みしてください。
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
shader = new Shader(this);
Log.d("Fragment", "OnCreate");
}
フラグメントの一時停止と再開に関しては、ほとんどの場合、フラグメントを動的に置き換えてバックスタックに追加すると自動的に処理されるため、適切な場所に surface.onpause() と surface.onResume() を配置するだけですそして、あなたは行ってもいいです。
物事を明確にするために、フラグメントのライフサイクルと glsurfaceview レンダラーを中心に展開するメソッドにログ ステートメントを入れてみてください。何が起こっていて、何が起こっていないかを確認できます。