Peter Nelson
Peter Nelson

Reputation: 5957

Trying to start renderer from GLSurfaceView declared in layout

I'm a newbie to OpenGL on Android and last week I described a problem failing to get the renderer to start for a GLSurfaceView declared in the layout. It starts fine if I declare the renderer in the Activity class and setContentView to it. Here's a simplifed version with all the source code. What am I doing wrong?

Layout . . .

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <Button
    android:id="@+id/dummy"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="a Button" />
  <FrameLayout
  android:id="@+id/framelay"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
     <com.test.rendertest.RTSurface
     android:id="@+id/RTSurfaceView"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"/>
  </FrameLayout>  
</LinearLayout>

Activity class. UNcomment the //A's, and comment-out the //B's and the renderer runs. But as shown below the renderer does not run even though its constructor gets called.

public class RenderTest extends Activity {

       RTSurface myView;
       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
//        myView = new RTSurface(this);   // A
//        setContentView(myView);         //A
          setContentView(R.layout.main);        // B
          myView = (com.test.rendertest.RTSurface)findViewById(R.id.RTSurfaceView);  //B
       }

       @Override
       protected void onPause() {
           super.onPause();
           myView.onPause();
       }

       @Override
       protected void onResume() {
           super.onResume();
           myView.onResume();
       }       
}

GLSurfaceView . . .

class RTSurface extends GLSurfaceView  {
   private final RTRenderer renderer;

   public RTSurface(Context context) {
      super(context);
      Log.i("rendertest", "RTSurface constructor - Default Form");
      renderer = new RTRenderer();
      setRenderer(renderer);
   }

   public RTSurface(Context context, AttributeSet attrs) {
      super(context, attrs);    
      Log.i("rendertest", "RTSurface constructor - Layout Form");
      renderer = new RTRenderer();
      setRenderer(renderer);
   }  
}

. . . and the Renderer (just stubs)

class RTRenderer implements GLSurfaceView.Renderer {

   public RTRenderer () {
       // a constructor just to have somewhere to set 
       // breakpoints and logcat messages
       Log.i("rendertest", "RTRenderer Constructor");      
   }

   public void onSurfaceCreated(GL10 gl, EGLConfig config) {               
      Log.i("rendertest", "onSurfaceCreated in RTRenderer");                   
   }

   public void onSurfaceChanged(GL10 gl, int width, int height) {
      Log.i("rendertest", "onSurfaceChanged in RTRenderer");                
   } 

   public void onDrawFrame(GL10 gl) {   
       Log.i("rendertest", "onDrawFrame in RTRenderer");     
     }  
} 

Thanks in advance!!

Upvotes: 0

Views: 1806

Answers (1)

Dalmas
Dalmas

Reputation: 26547

You didn't specify your LinearLayout orientation, so it is set to horizontal by default. This means your GLSurfaceView is outside of the screen (because you set your button width to fill_parent).

Just add the following attribute to your LinearLayout :

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

Upvotes: 2

Related Questions