这是我从画廊拍照的代码。
public class FragmentLayout1 extends Fragment implements OnClickListener {
View root;
Context c;
Button add_image;
DialogAddImage image;
RelativeLayout layout_image;
String path;
RunAnimations anima;
public void setContext(Context c){
this.c = c;
Constants con = new Constants(c);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
anima = new RunAnimations();
image = new DialogAddImage((Activity) c);
Bundle bun = new Bundle();
path = bun.getString("path");
root = inflater.inflate(R.layout.layout_1, container, false);
add_image = (Button)root.findViewById(R.id.button2);
add_image.setOnClickListener(this);
layout_image = (RelativeLayout)root.findViewById(R.id.layout_image);
if(!TextUtils.isEmpty(path)){
Log.e("path", path);
Drawable d = Drawable.createFromPath(path);
layout_image.setBackground(d);
}
return root;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
anima.loadAnimationView(c, R.anim.alpha_button, v);
if(v == add_image){
image.showDialog();
}
}
//============= fungsi untuk menerima hasil pilihan user dalam kotak dialog ambil gambar=============
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("result", "Result");
new ImageResult((Activity) c).resultOfImage(requestCode, resultCode, data, image.getUri(), false);
}
在点击方法中,我按下了add_image。 add_image将显示一个对话框,供用户从相机或图库中拍照 这是我的对话框代码
public class DialogAddImage{
private Activity c;
private Uri mImageCaptureUri;
private Dialog dialog;
AnimasiActivity aa;
Button camera, galeri;
public DialogAddImage(Activity c){
this.c = c;
aa = new AnimasiActivity(c);
setDialog();
}
//untuk mendapatkan uri yang menyimpan informasi path file image
public Uri getUri(){
return mImageCaptureUri;
}
@SuppressWarnings("deprecation")
private void setDialog(){
dialog = new Dialog(c);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_add_image);
dialog.getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(0));
camera = (Button) dialog.findViewById(R.id.button1);
galeri = (Button)dialog.findViewById(R.id.button2);
//kalo user pilih dari kamera
camera.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
hideDialog();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String file_name = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
File file = new File(Constants.path_image +file_name + ".jpg");
mImageCaptureUri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
try {
intent.putExtra("return-data", true);
intent.putExtra("mImageCaptureUri", mImageCaptureUri);
aa.startForwardForResult(intent, Constants.PICK_FROM_CAMERA);
} catch (Exception e) {
e.printStackTrace();
}
}
});
//kalo user pilih dari galery
galeri.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
hideDialog();
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
aa.startForwardForResult(intent, Constants.PICK_FROM_FILE);
}
});
}
public void showDialog(){
dialog.show();
}
public void hideDialog(){
dialog.dismiss();
}
}
但是当我从画廊中选择图像时,这张图片没有显示在我的片段中。和方法onActivityResult永远不会调用,但为什么???任何解决方案,请
答案 0 :(得分:14)
确保从片段中调用startActivityForResult()而不是getActivity()。startActivityForResult()。参考onActivityResult is not being called in Fragment
答案 1 :(得分:11)
覆盖父Activity中的onActivityResult
,即所有片段的父级
答案 2 :(得分:4)
如果您在onActivityResult
中覆盖Activity
,请确保在此处调用super.onActivityResult
,以便将结果传播到您的片段。
答案 3 :(得分:0)
此外,如果您从片段中调用startActivityForResult()
,则会在您的片段中调用onActivityResult()
。如果您从活动中致电startActivityForResult()
,则会在您的活动中调用onActivityResult()
。基本上,您致电startActivityForResult()
的地方是onActivityResult()
将被调用的地方。
另一件事,在Android中,创建对话框的首选方法是扩展DialogFragment类。
答案 4 :(得分:0)
问题是非常敏感的,并且我对此做出的观察(修复)有点棘手,如下所示,
当您从活动A调用活动B时,源活动(A)实例应该在堆栈(内存)中以调用" onActivityResult"打回来。
问题解释如下,
观察:从Material Design返回和NavUtils.navigateUpFromSameTask - 对navigateUpFromSameTask的描述如下 "等同于调用navigateUpTo(sourceActivity,getParentActivityIntent(sourceActivity))的便捷方法。 sourceActivity将通过此调用完成"
请记住,在使用此方法时,sourceActivity(A)将从堆栈(内存)中删除。
当没有sourceActivity(A)时,没有基本实例(A)可以调用" onActivityResult"回调。
答案 5 :(得分:0)
您只需覆盖片段onActivityResult
上的BaseActivity baseActivity.startActivityForResult
。
在BaseActivity上添加界面
private OnBaseActivityResult baseActivityResult;
On Fragment实现 OnBaseActivityResult
答案 6 :(得分:0)
我有一个自定义的DialogFragment,我遇到了同样的问题。无需从父方法中触发它。你必须调用startActivityForResult()而不是getActivity()。startActivityForResult()就像上面回答的@umesh一样。
答案 7 :(得分:0)
当您从片段中致电startActivityForResult
时,结果会被发送回您的活动onActivityResult
。而是在您的活动的super.onactivityResult
中使用onActivityResult
,然后将结果发送回您的片段onActivityResult
。你可以在这里编写代码。不要在您的片段getActivity.onactivityResult
中使用onActivityResult
,因为它会引用活动的onActivityResult
。