我的应用有两项活动:MainActivity和DrawingActivity。在MainActivity中,它显示了一个按钮,在DrawingActivity中,它在GLSurfaceview上显示了一个摄像头预览。我们的想法是,当您启动应用程序时,首先运行MainActivity,当您按下按钮时,您将跳转到初始化摄像机并显示摄像机预览的DrawingActivity。为此,我尝试在附加到按钮的intent
回调中定义onClickLIstener
对象。问题是,每次按下按钮,我的应用程序都会在stopEglSurfaceLocked()
类上调用private void GLSurfaceView
方法崩溃。
有趣的是,如果我在intent
方法之外定义onClick
,一切正常。
以下是一些相关的代码:
MainActivity:
public class MainActivity extends Activity {
private Button btnStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button) findViewById(R.id.btnDisplay);
btnStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DrawingActivity.class);
MainActivity.this.startActivity(intent);
finish();
}
});
}
的Manifest.xml:
<application
android:name="com.example.opengltest.AssetsCache"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:largeHeap="true">
<activity
android:name="com.example.opengltest.MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:label="@string/app_name"
android:name="com.example.opengltest.DrawingActivity"
android:screenOrientation="landscape">
</activity>
</application>
以下是错误的堆栈跟踪:
09-01 12:03:04.117: E/AndroidRuntime(13981): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.SurfaceTexture.updateTexImage()' on a null object reference
09-01 12:03:04.117: E/AndroidRuntime(13981): at com.example.opengltest.DrawingActivity.onNewFrame(DrawingActivity.java:526)
09-01 12:03:04.117: E/AndroidRuntime(13981): at com.google.vrtoolkit.cardboard.CardboardView$StereoRendererHelper.onDrawFrame(CardboardView.java:289)
09-01 12:03:04.117: E/AndroidRuntime(13981): at com.google.vrtoolkit.cardboard.CardboardView$RendererHelper.onDrawFrame(CardboardView.java:598)
09-01 12:03:04.117: E/AndroidRuntime(13981): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1531)
09-01 12:03:04.117: E/AndroidRuntime(13981): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1248)
重要: 虽然在DrawingActivity类中似乎有问题,但事实并非如此。如果我将Drawing Activity类作为主类,那么它在开始时调用(没有意图),everthing就可以了。最终,DrawingActivity类不是罪魁祸首,一切似乎都表明问题在于意图。我正在做一些事情,使得DrawingActivity类没有运行,因为它应该运行。
答案 0 :(得分:0)
您已将onClickListener
设置为:
btnStart.setOnClickListener(new OnClickListener() {
...
不正确,请按以下方式使用它来处理Android中的视图点击:
btnStart.setOnClickListener(new View.OnClickListener() {
...
了解详情:View.OnClickListener
只需在onClick
方法中启动您的意图:
Intent intent = new Intent(MainActivity.this, DrawingActivity.class);
startActivity(intent);
finish();
答案 1 :(得分:0)
使用try / catch / finally块启动DrawingActivity并完成MainActivity:
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try
{
//Try starting the Drawing activity
Intent intent = new Intent(MainActivity.this, DrawingActivity.class);
startActivity(intent);
}
catch(Exception ex)
{
//A problem occured, check Logcat
ex.printStackTrace();
}
finally
{
//DrawingActivity successfully started
//So, finish the MainActivity
finish();
}
}
});