在 Android 的片段中,onActivityResult 方法未被调用

5
这是我从相册中获取照片的代码。
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”的按钮。当点击该按钮时,它将显示一个对话框,供用户从相机或者图库中选择图片。 以下是我的对话框代码:

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方法也没有被调用,但为什么?请问有解决方案吗?


点击这里查看相关编程问题。 - Elhanan Mishraky
重复的问题 查看此链接 - Khaled Lela
8个回答

14

12

重写父Activity中的onActivityResult方法,即所有Fragment的父类


有同样的问题 http://stackoverflow.com/questions/34059269/why-the-facebook-sharing-is-not-working-with-fragments - Aditya Vyas-Lakhan

4
如果您在您的活动中覆盖了onActivityResult,那么请确保您也在那里调用super.onActivityResult以便将结果传播到您的片段。

你能告诉我为什么在使用片段时,Facebook分享功能无法正常工作吗? - Aditya Vyas-Lakhan
救了我的一天!有很多代码片段覆盖了onActivityResult而没有调用super。我以为它什么也不做... - Sira Lam

0

另外,如果您从片段中调用startActivityForResult(),则onActivityResult()将在片段中调用。如果您从活动中调用startActivityForResult(),则onActivityResult()将在活动中调用。基本上,您调用startActivityForResult()的位置就是onActivityResult()将被调用的位置。

另一件事,在Android中创建对话框的首选方法是扩展DialogFragment类。


0
我有一个自定义的DialogFragment,也遇到了同样的问题。无需从父类的方法中触发它。你需要调用startActivityForResult()而不是getActivity().startActivityForResult(),就像@umesh在上面回答的一样。

0
当您从片段调用startActivityForResult时,结果将发送回您的活动的onActivityResult。相反,在您的活动的onActivityResult中使用super.onactivityResult,结果将发送回您的片段的onActivityResult。您可以在此处编写代码。不要在片段的onActivityResult中使用getActivity.onactivityResult,因为它将引用活动的onActivityResult

0
  1. 你可以在Fragment中简单地重写BaseActivity的onActivityResult方法:baseActivity.startActivityForResult

  2. 在BaseActivity中添加接口:

    private OnBaseActivityResult baseActivityResult;

  3. 在Fragment中实现OnBaseActivityResult接口。

在这里查看我的答案


0
问题非常敏感,有点棘手,我对此的观察(修复)如下:
当您从Activity A调用Activity B时,源Activity(A)实例应该在堆栈(内存)中以调用“onActivityResult”回调。
以下是原因解释:
观察:从Material Design返回和NavUtils.navigateUpFromSameTask - navigateUpFromSameTask的描述如下:“方便的方法,相当于调用navigateUpTo(sourceActivity, getParentActivityIntent (sourceActivity))。此调用将完成sourceActivity。”请记住,使用此方法时,源Activity(A)将从堆栈(内存)中删除。
当没有源Activity(A)或没有基础实例(A)时,无法调用“onActivityResult”回调。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接