当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
提前致谢!
答案 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);
}
}