setContentView()与GLSurfaceView一起使用时崩溃

时间:2014-04-28 08:45:25

标签: java android android-layout opengl-es android-activity

我一直在尝试制作我的第一款Android应用。我遇到了这个奇怪的问题。很多人在过去遇到过同样的问题(如hereherehere以及许多其他地方),但这些解决方案似乎都不适合我。

我的问题是,如果我在此函数上设置类似setContentView(R.layout.MainActivity)应用程序崩溃的布局文件,但是如果我直接设置GLSurfaceView作为内容视图应用程序工作正常。我希望在同一屏幕上显示ListViewGLSurfaceView,这就是我尝试将其添加到XML中的原因。

这是我的布局文件

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

<com.example.camerafilters.CameraGLSurfaceView 
  android:id="@+id/CameraGLSurfaceView"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"/>

<!-- <ListView
android:id="@+id/ShaderList"
android:layout_width="wrap_content"
android:layout_height="wrap_content" /> 
  -->                                 
 </LinearLayout>

这是主要活动的相关部分。请注意,CameraGLSurfaceView是一个内部类。

public class CameraMainActivity extends Activity implements
SurfaceTexture.OnFrameAvailableListener 
{
private CameraGLSurfaceView _cameraGLView;

/**
 * Captures frames from an image stream as an OpenGL ES texture. The image stream may come from either camera preview or video decode.
 *  A SurfaceTexture may be used in place of a SurfaceHolder when specifying the output destination of a Camera or MediaPlayer object
 */
private SurfaceTexture _surface;

CameraGLRenderer _renderer;

private Camera _camera;

private ListView _shaderListView;

class CameraGLSurfaceView extends GLSurfaceView 
{
    CameraGLRenderer renderer;
    public CameraGLSurfaceView(Context context, AttributeSet attrs)
    {
        super(context, attrs);

        //  Create an OpenGL ES 2.0 context
        setEGLContextClientVersion(2);

        // Set the Renderer for drawing on the GLSurfaceView
        renderer = new CameraGLRenderer((CameraMainActivity)context);
        setRenderer(renderer);

        //  Render the view only when there is a change in the drawing data
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    }

    public CameraGLRenderer getRenderer()
    {
        return renderer;
    }
}


@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    _cameraGLView = new CameraGLSurfaceView(this, null);
    // Create a GLSurfaceView instance and set it
    // as the ContentView for this Activity. 
    setContentView(R.layout.activity_main);

    _cameraGLView = (CameraGLSurfaceView) findViewById(R.id.CameraGLSurfaceView);
    _renderer = _cameraGLView.getRenderer();

}

我错了的任何指针?

3 个答案:

答案 0 :(得分:1)

首先,看一下logcat中的异常堆栈跟踪,找出确切的问题。

然后,猜测问题是XML中指定的视图无法实例化:您的内部类需要public static,您需要在XML中正确引用它,例如

com.example.camerafilters.CameraMainActivity$CameraGLSurfaceView

虽然将它作为一个单独的类而不是内部类更清晰。

答案 1 :(得分:0)

为什么你在onCreate之前调用它?因为您在xml布局中定义了它,所以不需要调用它。 你不需要全部调用它。只需删除setContentView之前的行。

答案 2 :(得分:0)

您应该在GLSurfaceView.setRenderer()

中致电Activity.onCreate()