我想在EditUserActivity.java里面,点击一个ImageButton,然后跳到一个fragment,fragment里面有两个按钮,分别是拍照和从相册选择,选择了图片之后,将图片的路径传回给EditUserAcitiviy.java里面,把刚才获得的图片设置为ImageButton的背景图。
错误信息:
EditUserActivity.java
SelectPhotoDialogFragment.java
错误信息:
09-01 13:55:47.288: I/BBBBBB(14686): 图库
09-01 13:55:55.928: I/TagDialogFragment(14686): imagePath = /storage/sdcard1/baidu/imeface.png
09-01 13:55:55.928: I/@ EditUserActivity.java AAAAAAAAA(14686): /storage/sdcard1/baidu/imeface.png
09-01 13:55:55.928: I/System.out(14686): java.lang.NullPointerException
09-01 13:55:55.928: W/System.err(14686): java.lang.NullPointerException
09-01 13:55:55.928: W/System.err(14686): at android.app.Activity.findViewById(Activity.java:1914)
09-01 13:55:55.928: W/System.err(14686): at com.example.tracemap.activity.EditUserActivity.toDisplayPhoto(EditUserActivity.java:88)
09-01 13:55:55.928: W/System.err(14686): at com.example.tracemap.activity.EditUserActivity.photoUriCallback(EditUserActivity.java:105)
09-01 13:55:55.928: W/System.err(14686): at com.example.tracemap.fragment.SelectPhotoDialogFragment.doPhoto(SelectPhotoDialogFragment.java:200)
09-01 13:55:55.928: W/System.err(14686): at com.example.tracemap.fragment.SelectPhotoDialogFragment.onActivityResult(SelectPhotoDialogFragment.java:210)
09-01 13:55:55.928: W/System.err(14686): at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:163)
09-01 13:55:55.928: W/System.err(14686): at android.app.Activity.dispatchActivityResult(Activity.java:5530)
09-01 13:55:55.928: W/System.err(14686): at android.app.ActivityThread.deliverResults(ActivityThread.java:3589)
09-01 13:55:55.928: W/System.err(14686): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3636)
09-01 13:55:55.928: W/System.err(14686): at android.app.ActivityThread.access$1600(ActivityThread.java:141)
09-01 13:55:55.928: W/System.err(14686): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1290)
09-01 13:55:55.928: W/System.err(14686): at android.os.Handler.dispatchMessage(Handler.java:102)
09-01 13:55:55.928: W/System.err(14686): at android.os.Looper.loop(Looper.java:136)
09-01 13:55:55.928: W/System.err(14686): at android.app.ActivityThread.main(ActivityThread.java:5290)
09-01 13:55:55.928: W/System.err(14686): at java.lang.reflect.Method.invokeNative(Native Method)
09-01 13:55:55.928: W/System.err(14686): at java.lang.reflect.Method.invoke(Method.java:515)
09-01 13:55:55.938: W/System.err(14686): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:859)
09-01 13:55:55.938: W/System.err(14686): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:675)
09-01 13:55:55.938: W/System.err(14686): at dalvik.system.NativeStart.main(Native Method)
09-01 13:55:55.938: I/CCCCC(14686): here!
EditUserActivity.java
package com.example.tracemap.activity;
import com.example.tracemap.activity.base.BaseFragmentActivity;
import com.example.tracemap.fragment.SelectPhotoDialogFragment;
public class EditUserActivity extends BaseFragmentActivity {
private ImageButton btnClose;
private ImageButton header;
android.support.v4.app.FragmentManager mFragmentManager = getSupportFragmentManager();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_user);
btnClose = (ImageButton)findViewById(R.id.btn_back);
header = (ImageButton)findViewById(R.id.header);
btnClose.setOnClickListener(mOnClickListener);
header.setOnClickListener(mOnClickListener);
}
protected Context getActivity() {
// TODO Auto-generated method stub
return this;
}
protected void Close()
{
this.finish();
}
public SelectPhotoDialogFragment.DialogCallback selectPhotoCallback = new SelectPhotoDialogFragment.DialogCallback (){
@Override
public void onSuccess(Bundle data) {
// TODO Auto-generated method stub
}
};
OnClickListener mOnClickListener = new OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.btn_back:
Close();
break;
case R.id.header:
SelectPhotoDialogFragment fragment = SelectPhotoDialogFragment.getInstance(selectPhotoCallback);
Bundle bundle = new Bundle();
//FragmentTransaction ft = getFragmentManager().beginTransaction();
//FragmentTransaction ft = getFragmentManager().beginTransaction();
fragment.show(mFragmentManager, SelectPhotoDialogFragment.TAG);
break;
}
}
};
/**
* 将选择的图片显示在头像位置
* @param photoUri
*/
private void toDisplayPhoto(String picPath){
ImageButton imageButton = (ImageButton)findViewById(R.id.header);
//Bitmap mHeader = BitmapFactory.decodeStream(getClass().getResourceAsStream(picPath));
Drawable drawable = Drawable.createFromPath(picPath);
imageButton.setBackground(drawable);
//imageButton.setImageResource(R.drawable.ic_camera);
}
/**
* 回调函数
* @param photoUri
*/
public void photoUriCallback(String picPath){
Log.i("@ EditUserActivity.java AAAAAAAAA", picPath);
//toDisplayPhoto(picPath);
try {
toDisplayPhoto(picPath);
} catch (Exception e) {
// TODO: handle exception
Log.i("EditUserActivity.java-line:107", "");
System.out.println(e);
e.printStackTrace();
}
}
}
SelectPhotoDialogFragment.java
package com.example.tracemap.fragment;
import com.example.tracemap.activity.EditUserActivity;
public class SelectPhotoDialogFragment extends DialogFragment implements OnClickListener {
public final static String TAG = TagDialogFragment.class.getSimpleName();
public static final int SELECT_PIC_BY_TACK_PHOTO = 1; // 使用照相机拍照获取图片
public static final int SELECT_PIC_BY_PICK_PHOTO = 2; // 使用相册中的图片
public static final String KEY_PHOTO_PATH = "photo_path"; // 从Intent获取图片路径的KEY
private String picPath; // 获取到的图片路径
private Uri photoUri;
private Intent lastIntent;
DialogCallback mCallback;
RelativeLayout bg;
private SelectPhotoDialogFragment(DialogCallback callback) {
this.mCallback = callback;
}
private static SelectPhotoDialogFragment mInstance;
public synchronized static SelectPhotoDialogFragment getInstance(DialogCallback callback) {
if (mInstance == null) {
mInstance = new SelectPhotoDialogFragment(callback);
}
return mInstance;
}
@SuppressLint("NewApi")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_dialog_selectphoto, container, false);
initView(view);
return view;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
dialog.setCanceledOnTouchOutside(false);
dialog.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
//
}
});
return dialog;
}
private void initView(View view){
Button btnTakePhoto = (Button) view.findViewById(R.id.btn_take_photo);
Button btnPickPhoto = (Button) view.findViewById(R.id.btn_pick_photo);
btnTakePhoto.setOnClickListener(this);
btnPickPhoto.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_take_photo:
Log.i("AAAAAA", "拍照");
takePhoto();
break;
case R.id.btn_pick_photo:
Log.i("BBBBBB", "图库");
pickPhoto();
break;
default:break;
}
}
/**
* 拍照获取图片
*/
private void takePhoto() {
// 执行拍照之前,先检查SD卡是否存在
String SDState = Environment.getExternalStorageState();
if (SDState.equals(Environment.MEDIA_MOUNTED)) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
ContentValues values = new ContentValues();
photoUri = getActivity().getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, SELECT_PIC_BY_TACK_PHOTO);
} else {
Toast.makeText(getActivity(), "内存卡不存在", Toast.LENGTH_LONG).show();
}
}
/**
* 从相册中取图片
*/
private void pickPhoto() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, SELECT_PIC_BY_PICK_PHOTO);
}
public interface DialogCallback {
public void onSuccess(Bundle data);
}
/**
* 获取图片的路径
*/
private void doPhoto(int requestCode, Intent data) {
if (requestCode == SELECT_PIC_BY_PICK_PHOTO) {
if (data == null) {
Toast.makeText(getActivity(), "选择图片文件出错", Toast.LENGTH_LONG).show();
return;
}
photoUri = data.getData();
if (photoUri == null) {
Toast.makeText(getActivity(), "选择图片文件出错", Toast.LENGTH_LONG).show();
return;
}
}
String[] pojo = { MediaStore.Images.Media.DATA };
Cursor cursor = getActivity().managedQuery(photoUri, pojo, null, null, null);
if (cursor != null) {
int columnIndex = cursor.getColumnIndexOrThrow(pojo[0]);
cursor.moveToFirst();
picPath = cursor.getString(columnIndex);
if(VERSION.SDK_INT < 14) {
cursor.close();
}
}
Log.i(TAG, "imagePath = " + picPath);
if (picPath != null
&& (picPath.endsWith(".png") || picPath.endsWith(".PNG")
|| picPath.endsWith(".jpg") || picPath.endsWith(".JPG"))) {
//将picPath传给EditUserActivity
EditUserActivity editUserActivity = new EditUserActivity();
editUserActivity.photoUriCallback(picPath);
} else {
Toast.makeText(getActivity(), "选择图片文件不正确", Toast.LENGTH_LONG).show();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (resultCode == Activity.RESULT_OK) {
doPhoto(requestCode, data);
Log.i("CCCCC", "here!");
}
super.onActivityResult(requestCode, resultCode, data);
}
}