我一直在尝试制作我的第一款Android应用。我遇到了这个奇怪的问题。很多人在过去遇到过同样的问题(如here,here,here以及许多其他地方),但这些解决方案似乎都不适合我。
我的问题是,如果我在此函数上设置类似setContentView(R.layout.MainActivity)
应用程序崩溃的布局文件,但是如果我直接设置GLSurfaceView
作为内容视图应用程序工作正常。我希望在同一屏幕上显示ListView
和GLSurfaceView
,这就是我尝试将其添加到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();
}
我错了的任何指针?
答案 0 :(得分:1)
首先,看一下logcat中的异常堆栈跟踪,找出确切的问题。
然后,猜测问题是XML中指定的视图无法实例化:您的内部类需要public static
,您需要在XML中正确引用它,例如
com.example.camerafilters.CameraMainActivity$CameraGLSurfaceView
虽然将它作为一个单独的类而不是内部类更清晰。
答案 1 :(得分:0)
为什么你在onCreate之前调用它?因为您在xml布局中定义了它,所以不需要调用它。 你不需要全部调用它。只需删除setContentView之前的行。
答案 2 :(得分:0)
您应该在GLSurfaceView.setRenderer()
Activity.onCreate()