Android Java:修改按钮点击处理程序中的实例变量

Android Java:修改按钮点击处理程序中的实例变量,java,android,Java,Android,在Button OnClick()处理程序中分配/修改类的实例变量有一种奇怪的行为 如下所示,实例变量“CurrentFile”在imgBtn.setOnClickListener()处理程序中被修改。但在onActivityResult()方法中访问此变量时,此变量包含值“null” 根据我的理解,“GetPicActivity”活动在相机活动返回之前不会被销毁。因此,实例变量“CurrentFile”不应为null 如果我缺少一些基础知识,请帮助我 import java.io.File;

在Button OnClick()处理程序中分配/修改类的实例变量有一种奇怪的行为

如下所示,实例变量“CurrentFile”在imgBtn.setOnClickListener()处理程序中被修改。但在onActivityResult()方法中访问此变量时,此变量包含值“null”

根据我的理解,“GetPicActivity”活动在相机活动返回之前不会被销毁。因此,实例变量“CurrentFile”不应为null

如果我缺少一些基础知识,请帮助我

import java.io.File;
import java.io.IOException;

import com.favoritepics.R;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;

public class GetPicActivity extends Activity {

protected static final int ID_REQ_IMAGE_CAPTURE = 1;
protected static final int ID_REQ_PICK_PHOTO = 0;
protected File currentFile = null;  /// Goal is "to modify this variable inside Button onClick handlers"

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

    getWindow().setBackgroundDrawable(
            new ColorDrawable(android.graphics.Color.DKGRAY));

    setContentView(R.layout.activity_get_pic);

    // set handler image gallery
    ImageButton imgBtn = (ImageButton) findViewById(R.id.imgGallery);
    imgBtn.setOnClickListener(new ImageButton.OnClickListener() {

        @Override
        public void onClick(View v) {
            // create intent to take picture on camera
            Intent pickPhoto = new Intent(
                    Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

            startActivityForResult(pickPhoto, ID_REQ_PICK_PHOTO);
        }
    });

    // set handler for camera image
    imgBtn = (ImageButton) findViewById(R.id.imgCamera);
    imgBtn.setOnClickListener(new ImageButton.OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File tempDir = Environment.getExternalStorageDirectory();
            File tempFile = null;

            try {

                currentFile = File
                        .createTempFile("_jpeg_", ".jpg", tempDir);

            } catch (IOException exception) {
                Toast.makeText(
                        GetPicActivity.this,
                        "Problem occured during creation of temp file! "
                                + exception.getMessage(),
                        Toast.LENGTH_SHORT).show();
            }

            if (currentFile != null) {
                takePicture.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(currentFile));
                startActivityForResult(takePicture, ID_REQ_IMAGE_CAPTURE);

            }
        }
    });

    // set handler for cancel button
    Button btnCancel = (Button) findViewById(R.id.btnCancel);

    btnCancel.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case ID_REQ_IMAGE_CAPTURE:
           if (resultCode == RESULT_OK) {
              Intent newIntent = new Intent();
              newIntent.putExtra("TYPE", requestCode);
              newIntent.putExtra("PATH", currentFile.getAbsolutePath());
              setResult(RESULT_OK, newIntent);
                finish();
           }

           break;

        default:
           break;
    }
  }
}
单击此处查看

我打算做的步骤:

1、在外部存储器中为相机图片的目标创建一个临时文件

2、通过传递临时文件的URI启动摄像机拍照

3,在摄像机的OnActivityResult()上,将(临时)文件路径返回到上一个活动,以便进一步处理

但我看到的是

一旦启动相机并拍摄照片,就会再次创建GetPicActivity。因此,实例变量“CurrentFile”将为null&在OnActivityResult()中,我无法获取临时文件的文件路径。


为什么启动相机后GetPicActivity会被破坏?

当相机启动时,相机会出现在屏幕方向“
横向

甚至已经存在的活动堆栈的方向也更改为“
横向”
”itseems


因此,当摄像头的结果返回到GetPicActivity方法OnActivityResult()时,会再次创建
GetPicActivity
。但是现在,实例变量“
CurrentFile
”为空。这就产生了一个
NullPointerException

我已经添加了一个到日志的链接,为什么在这里有finish()?一旦此活动从Camerai获得图片,我想将结果返回到上一个活动。我还没有尝试使用tempFile方法。我想你应该在启动相机后用简单文件obj.GetPicActivity销毁一次吗?这是不可能的。我现在没有测试相机代码的设备,否则我可能会告诉你原因。