我的程序有两个视图
一个是主视图MainView,继承自SurfaceView
activity启动是就是设置这个视图为当前视图
还有一个是opengl的视图GlView,继承自GLSurfaceView
这两个视图之间没有任何关系
只是在MainView里的一个按钮里,点击一下就会调用setContentView(GlView)切换到gl视图显示
这时没有任何问题
而在GlView里调用setContentView(MainView)切换回去的时候出现异常了ERROR/AndroidRuntime(4078): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.我程序里的这两个视图根本就没有什么父子关系的
为什么会有这样的异常?

解决方案 »

  1.   

    MainView 因为之前已经加载过了,有了父级别的容器,之后又加载就会报错,需要在加载之前,让mainview的父级别先remove掉mainview,才能加载mainview。
    你可以都加在在一个容器中,用隐藏和显示来切换。
      

  2.   

    谢谢楼上
    对android框架不了解
    具体怎样可用remove掉之前的mainview呢?
      

  3.   

    ...
    只是在MainView里的一个按钮里...
    ...SurfaceView里只能有一个直接子类,你可以用一个其它布局把里面的所有控件装起来,再把这个布局放在SurfaceView里就可以了,如果还没有解决,贴出你的XML布局来看看。
      

  4.   

    我没用xml,都是动态写的SurfaceView里只能有一个直接子类
    这是什么意思,一个程序里只能有一个view继承SurfaceView?
      

  5.   

    举例:
    <ScrollView ...>
      <Button />
      <Button />
      <Button />
    </ScrollView>
    这样是错的 必须这样:
    <ScrollView ...>
      <LinearLayout ...>
        <Button />
        <Button />
        <Button />
      </LinearLayout>
    </ScrollView>
      

  6.   

    谢谢楼上
    可能我没描述清楚
    其实我的两个view里都没有任何的android控件
    都是自己画的东西,跟android相关的也就bitmap
    我这里说的点击按钮切换到glview,其实这个按钮是自己画的一个东西
      

  7.   

    GlView.removeAllViews();
    MainView.removeAllViews();
    两个分别加上试试
      

  8.   

    哎呀。 原来我把SurfaceView和ScrollView 看混了。。
    试试7楼,不好意思。
      

  9.   

    这两个方法是哪个类里的
    我试了一下都没有这样的方法
    remove开头的只有removeCallbacks
      

  10.   

    是我搞错了,后来加了个layout,这个mainview放layout里了
      

  11.   


    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout=new LinearLayout(this);
    SurfaceView surfaceView =new SurfaceView(this);
    layout.addView(surfaceView);
    setContentView(layout); //设置显示为layout

    //跳转时先删除
    layout.removeAllViews();
    GLSurfaceView glSurfaceView=new GLSurfaceView(this);
    layout.addView(glSurfaceView);
    setContentView(layout);

    }