在onClick方法

时间:2016-09-01 09:15:54

标签: android button android-intent onclick onclicklistener

我的应用有两项活动: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类没有运行,因为它应该运行。

2 个答案:

答案 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();
            }
        }
    });