fragment中onActivityResult无法返回和在startActivityForResult调用后立即调用解决办法
2014-08-15 10:02
555 查看
以前都只是在activity中使用startActivityForResult和onActivityResult方法,是没有任何问题的
但是这次需要在fragment调用startActivityForResult,跳转到activity,在fragment中重写onActivityResult方法拿到返回值
就出了一点问题
首先,我是写的this.getActivity.startActivityForResult(intent,1);
结果发现onActivityResult方法完全没有响应
查找资料发现,要直接写startActivityForResult(intent,1); 千万不要加前面的this.getActivity等字段
这时候应该就可以调试到onActivityResult方法里面了,如果还没运行这个方法,可以在这个fragment依附的fragmentActivity中重写onActivityResult方法,调用super,就没问题了
然后可能会出现这个问题,每次startActivityForResult方法刚一调用,还没等activity返回,onActivityResult方法已经执行完了
为什么呢
其实非常简单,你是在manifest中对这些交互的某个activity设置了launchMode属性
只需要把launchMode属性去掉或者设置为标准模式,就可以了
这时候,就可以和activity一样正常的获取到返回值了
下面我贴上我自己的代码给大家参考一下
fragment中
Intent intent = new Intent(v.getContext(), SendImageDialog.class);
startActivityForResult(intent, 1);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case 1:
if (data != null) {
//取得返回的Uri,基本上选择照片的时候返回的是以Uri形式
Uri mImageCaptureUri = data.getData();
//返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取
if (mImageCaptureUri != null) {
String imageUrl=getPath(mImageCaptureUri);
String imageuploadreturnUrl=ImageUpload.fileUpload(imageUrl);
//获取xml文件中的url
String urlMsg=subStrURL(imageuploadreturnUrl);
//发送到服务器
checkConnection(urlMsg, MESSAGETYPE.INT_TYPE_IMAGE);
} else {
Bundle extras = data.getExtras();
if (extras != null) {
//这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片
Bitmap image = extras.getParcelable("data");
String imageName = new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".png";
if (image != null) {
//保存图片到sd卡,返回物理路径
String saveresult=ImageDownload.savePicToSdcard(image,FileUtil.IMG_PATH, imageName);
Log.d("TAG", "saveresult===="+saveresult);
String imageuploadreturnUrl=ImageUpload.fileUpload(saveresult);
String urlMsg=subStrURL(imageuploadreturnUrl);
checkConnection(urlMsg, MESSAGETYPE.INT_TYPE_IMAGE);
}
}
}
}
break;
default:
break;
}
}
activity
public class SendImageDialog extends Activity implements OnClickListener{
private Button paizhao, xiangce, quxiao;
private LinearLayout layout;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sendimage_dialog_layout);
// dialog=new MyDialog(this);
intent = getIntent();
paizhao = (Button) this.findViewById(R.id.bt_paizhao);
xiangce = (Button) this.findViewById(R.id.bt_xiangce);
quxiao = (Button) this.findViewById(R.id.exitBtn1);
layout = (LinearLayout) findViewById(R.id.exit_layout2);
layout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
Toast.LENGTH_SHORT).show();
}
});
// 添加按钮监听
paizhao.setOnClickListener(this);
xiangce.setOnClickListener(this);
quxiao.setOnClickListener(this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
finish();
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
return;
}
//选择完或者拍完照后会在这里处理,然后我们继续使用setResult返回Intent以便可以传递数据和调用
if (data.getExtras() != null){
intent.putExtras(data.getExtras());
}
if (data.getData()!= null){
intent.setData(data.getData());
}
setResult(1, intent);
Log.d("TAG", "result1111");
finish();
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_paizhao:
try {
//拍照用Action为MediaStore.ACTION_IMAGE_CAPTURE,
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
} catch (Exception e) {
e.printStackTrace();
}
break;
case R.id.bt_xiangce:
try {
//选择照片的时候用Action为Intent.ACTION_GET_CONTENT,
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 2);
} catch (ActivityNotFoundException e) {
}
break;
case R.id.exitBtn1:
finish();
break;
default:
break;
}
}
}
在fragmentActivity中
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
// TODO Auto-generated method stub
super.onActivityResult(arg0, arg1, arg2);
}
manifest就不贴了,直接去掉launchMode属性就可以了
但是这次需要在fragment调用startActivityForResult,跳转到activity,在fragment中重写onActivityResult方法拿到返回值
就出了一点问题
首先,我是写的this.getActivity.startActivityForResult(intent,1);
结果发现onActivityResult方法完全没有响应
查找资料发现,要直接写startActivityForResult(intent,1); 千万不要加前面的this.getActivity等字段
这时候应该就可以调试到onActivityResult方法里面了,如果还没运行这个方法,可以在这个fragment依附的fragmentActivity中重写onActivityResult方法,调用super,就没问题了
然后可能会出现这个问题,每次startActivityForResult方法刚一调用,还没等activity返回,onActivityResult方法已经执行完了
为什么呢
其实非常简单,你是在manifest中对这些交互的某个activity设置了launchMode属性
只需要把launchMode属性去掉或者设置为标准模式,就可以了
这时候,就可以和activity一样正常的获取到返回值了
下面我贴上我自己的代码给大家参考一下
fragment中
Intent intent = new Intent(v.getContext(), SendImageDialog.class);
startActivityForResult(intent, 1);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case 1:
if (data != null) {
//取得返回的Uri,基本上选择照片的时候返回的是以Uri形式
Uri mImageCaptureUri = data.getData();
//返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取
if (mImageCaptureUri != null) {
String imageUrl=getPath(mImageCaptureUri);
String imageuploadreturnUrl=ImageUpload.fileUpload(imageUrl);
//获取xml文件中的url
String urlMsg=subStrURL(imageuploadreturnUrl);
//发送到服务器
checkConnection(urlMsg, MESSAGETYPE.INT_TYPE_IMAGE);
} else {
Bundle extras = data.getExtras();
if (extras != null) {
//这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片
Bitmap image = extras.getParcelable("data");
String imageName = new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".png";
if (image != null) {
//保存图片到sd卡,返回物理路径
String saveresult=ImageDownload.savePicToSdcard(image,FileUtil.IMG_PATH, imageName);
Log.d("TAG", "saveresult===="+saveresult);
String imageuploadreturnUrl=ImageUpload.fileUpload(saveresult);
String urlMsg=subStrURL(imageuploadreturnUrl);
checkConnection(urlMsg, MESSAGETYPE.INT_TYPE_IMAGE);
}
}
}
}
break;
default:
break;
}
}
activity
public class SendImageDialog extends Activity implements OnClickListener{
private Button paizhao, xiangce, quxiao;
private LinearLayout layout;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sendimage_dialog_layout);
// dialog=new MyDialog(this);
intent = getIntent();
paizhao = (Button) this.findViewById(R.id.bt_paizhao);
xiangce = (Button) this.findViewById(R.id.bt_xiangce);
quxiao = (Button) this.findViewById(R.id.exitBtn1);
layout = (LinearLayout) findViewById(R.id.exit_layout2);
layout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
Toast.LENGTH_SHORT).show();
}
});
// 添加按钮监听
paizhao.setOnClickListener(this);
xiangce.setOnClickListener(this);
quxiao.setOnClickListener(this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
finish();
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
return;
}
//选择完或者拍完照后会在这里处理,然后我们继续使用setResult返回Intent以便可以传递数据和调用
if (data.getExtras() != null){
intent.putExtras(data.getExtras());
}
if (data.getData()!= null){
intent.setData(data.getData());
}
setResult(1, intent);
Log.d("TAG", "result1111");
finish();
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_paizhao:
try {
//拍照用Action为MediaStore.ACTION_IMAGE_CAPTURE,
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
} catch (Exception e) {
e.printStackTrace();
}
break;
case R.id.bt_xiangce:
try {
//选择照片的时候用Action为Intent.ACTION_GET_CONTENT,
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 2);
} catch (ActivityNotFoundException e) {
}
break;
case R.id.exitBtn1:
finish();
break;
default:
break;
}
}
}
在fragmentActivity中
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
// TODO Auto-generated method stub
super.onActivityResult(arg0, arg1, arg2);
}
manifest就不贴了,直接去掉launchMode属性就可以了
相关文章推荐
- 解决Android中Fragment调用startactivityforresult不能返回结果的问题
- 调用startActivityForResult,onActivityResult无响应的解决办法
- 调用startActivityForResult 后 立刻执行了onActivityResult 解决办法
- Fragment与宿主Activity都调用startActivityForResult,onActivityResult不执行解决办法
- 解决Android中Fragment(SherlockFragment)调用startActivityForResult返回requestCode错误的问题
- startActivityForResult无法调用singleTask的Activity返回的数据
- 关于调用startActivityForResult()方法后Activity直接退出的问题原因和解决办法
- 调用startActivityForResult启动activity,返回当前页不响应的问题(附带activity携带参数流程)
- 调用startActivityForResult后,onActivityResult立刻响应,返回当前页onActivityResult不响应的问题
- 调用startAcyivityForResult后立即执行onActivityResult
- 调用startActivityForResult之后,onActivityResult立即响应
- Tabhost中子Activity使用startActivityForResult后获取不到回调值问题的解决办法
- startActivityForResult调用后立即响应了OnActivityResult()方法,导致setResult()后无响应
- Android FragmentActivity 嵌套 Fragment 调用startActivityForResult返回的requestCode错误
- 关于startActivityForResult跳转页面返回时onActivityResult回调无法执行的问题
- Android开发 Fragment中调用startActivityForResult返回错误的requestCode
- startActivityForResult无法调用singleTask的Activity
- Android学习-启动服务startActivityForResult调用activity并覆写onActivityResult()接收返回来的信息
- 关于startActivityForResult()方法后Activity直接退出的问题原因和解决办法
- startActivityForResult无法调用singleTask的Activity