Android Java:修改实例变量内部按钮单击处理程序



分配/修改类别的实例变量的行为奇怪

如下所示,实例变量" Currentfile"在IMGBTN.SetOnClickListener()处理程序中进行了修改。但是,当在OnActivityResult()方法中访问此变量时,此变量包含" null"。

的值。

根据我的理解,活动" getpicativity"直到摄像机活动返回之前,不会被破坏。因此,实例变量" 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;
    }
  }
}

单击此处查看logcat消息

步骤我打算做的事情:

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

2,启动摄像头通过传递临时文件的URI

拍照

3,摄像机的onActivityResult(),将(临时)文件路径返回到以前的活动以进行进一步的过程

但是我看到的是

一旦启动相机&拍摄图片,再次创建getpicactivity。因此,实例变量" CurrentFile"将是无效的在OnActivityResult()中,我无法获得临时文件的文件路径。

为什么启动摄像机后会破坏getpicativity?

启动相机时,摄像机出现在屏幕方向" Landscape"。

即使已经存在的活动堆栈的方向更改为" Landscape" itseems。

因此,当返回摄像机的结果恢复到getpicactivity方法OnActivityResult()时,再次创建了GetPicActivity。但是现在,实例变量" CurrentFile"为null。这给出了NullPointerException

最新更新