如何处理GLSurfaceView的onPause / onResume

时间:2011-12-13 05:08:11

标签: android opengl-es

当GlSurfaceView嵌入布局时,例如

  <FrameLayout
  android:id="@+id/framelay"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
     <com.nelsondev.myha3ogl.M3View
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"/>
  </FrameLayout> 

然后当布局膨胀时,它会使用带有签名的构造函数自动构造: GLSurfaceView(Context context,AttributeSet attrs)。因此,它不是在Activity类中逐字声明或实例化的。

Android文档说Activity的onPause / onResume必须调用SurfaceView的onPause / onResume。我该怎么做?即,夸大布局的Activity如何能够访问GlSurfaceView对象来进行这些调用?

修改:适用于Android 2.2

提前致谢!

1 个答案:

答案 0 :(得分:2)

在XML布局中,通过添加name属性为SurfaceView命名:

<com.nelsondev.myha3ogl.M3View
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/my_surfaceView1"/>

接下来,覆盖活动中的onPause和onResume,使用findViewById(R.id.my_surfaceView1);查找视图,然后在surfaceView上调用onPause和onResume:

@Override
public void onPause(){
    com.nelsondev.myha3ogl.M3View myView = (com.nelsondev.myha3ogl.M3View)findViewById(R.id.my_surfaceView1);

    myView.onPause();

    super.onPause();

}

最后,在您的表面视图的实现中,覆盖onPause()/ onResume()并在您的活动暂停/恢复时放置您需要执行的任何代码。还要记得在曲面视图中调用super.onPause()/ super.onResume()

<小时/> 编辑:为了澄清,您可以在任何ViewGroup对象上使用findViewById()方法在该视图组中查找子视图:

MyActivity extends Activity{

    public void onCreate(Bundle bundle){

        FrameLayout myFrameLayout = (FrameLayout)getLayoutInflater().inflate(R.layout.graphics, null, false);
        TextView myView = (TextView)myFrameLayout.findViewById(R.id.textView1);

        if(myView!=null){
            myView.setText("about to be removed");
            myFrameLayout.removeView(myView);
        }

        setContentView(myFrameLayout);


    }
}

findViewById()也是Activity中的一种方法,可以使用setContentView();

找到您设置的布局中的任何视图
MyActivity extends Activity{

    public void onCreate(Bundle bundle){
        setContentView(R.layout.graphics);
        // where the xml file in your question is called graphics.xml    
        com.nelsondev.myha3ogl.M3View myGLSurfaceView = (com.nelsondev.myha3ogl.M3View)findViewById(R.id.my_surfaceView1);
        FrameLayout myFrameLayout = (FrameLayout)findViewById(R.id.framelay);
    }
}