Android Java:修改按钮点击处理程序中的实例变量
在Button OnClick()处理程序中分配/修改类的实例变量有一种奇怪的行为 如下所示,实例变量“CurrentFile”在imgBtn.setOnClickListener()处理程序中被修改。但在onActivityResult()方法中访问此变量时,此变量包含值“null” 根据我的理解,“GetPicActivity”活动在相机活动返回之前不会被销毁。因此,实例变量“CurrentFile”不应为null 如果我缺少一些基础知识,请帮助我Android Java:修改按钮点击处理程序中的实例变量,java,android,Java,Android,在Button OnClick()处理程序中分配/修改类的实例变量有一种奇怪的行为 如下所示,实例变量“CurrentFile”在imgBtn.setOnClickListener()处理程序中被修改。但在onActivityResult()方法中访问此变量时,此变量包含值“null” 根据我的理解,“GetPicActivity”活动在相机活动返回之前不会被销毁。因此,实例变量“CurrentFile”不应为null 如果我缺少一些基础知识,请帮助我 import java.io.File;
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销毁一次吗?这是不可能的。我现在没有测试相机代码的设备,否则我可能会告诉你原因。