【问题标题】:OnActivityResult not getting calledOnActivityResult 没有被调用
【发布时间】:2019-03-31 23:39:22
【问题描述】:

在活动 A 中,我想打开一个对话框 (CustomDialog)。在 CustomDialog 内部,它有一个打开相机的按钮。但是onActivityResult 在我从图库中选择图像后没有被调用。没有 toast 正在显示。

活动 A

private void openDialog() {
        CustomDialog alert = new CustomDialog();
        alert.showDialog(this);
    }

自定义对话框

public class CustomDialog extends Activity{

    Activity activity;
    ImageView imageView;

    public void showDialog(Activity activity) {
        this.activity = activity;
        final Dialog dialog = new Dialog(activity);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCancelable(false);
        dialog.setContentView(R.layout.custom_dialog);
        dialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
        dialog.setCanceledOnTouchOutside(true);

        imageView = (ImageView) dialog.findViewById(R.id.logoApp);

        Button galleryBtn = (Button) dialog.findViewById(R.id.galleryBtn);

        galleryBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                galleryIntent();
            }
        });
        dialog.show();
    }

    private void galleryIntent() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);//
        activity.startActivityForResult(Intent.createChooser(intent, "Select File"), 1);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Toast.makeText(activity,"sdddddsss",Toast.LENGTH_LONG).show();
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == 1) {
                onSelectFromGalleryResult(data);
            }else{
              // ...
            }
        }
    }

    @SuppressWarnings("deprecation")
    private void onSelectFromGalleryResult(Intent data) {
        Bitmap bm=null;
        if (data != null) {
            try {
                bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        imageView.setImageBitmap(bm);
    }
}

我关注这个http://www.theappguruz.com/blog/android-take-photo-camera-gallery-code-sample

【问题讨论】:

    标签: java android android-gallery onactivityresult


    【解决方案1】:

    当您在 Activity A 中显示对话框时,您将对 Activity A 的引用设置为参数: alert.showDialog(this); 然后在 CustomDialog 中,将此引用保存为活动变量:

    public void showDialog(Activity activity) { this.activity = activity; ...}

    这意味着,this.activity 是 Activity A 的实例。稍后在您的 galleryIntent() 中,您启动 Activity 以获得如下结果:

    private void galleryIntent() { ... activity.startActivityForResult(Intent.createChooser(intent, "Select File"), 1); }

    这意味着 onActivityResult 将在活动 A 中调用,而不是在您的自定义对话框中,因为您使用了 activity 变量。

    您有 2 个修复选项:

    1) 将activity.startActivityForResult 替换为CustomDialog.this.startActivityForResult

    2) 将您的 onActivityResult 代码从 CustomDialog 移至 Activity A

    【讨论】:

    • 我的项目流程是这样的:从firstActivity-->Activity A-->然后点击Activity A的按钮打开Custom Dialog。接下来在对话框中选择图像 ---> 在 Activity A 中显示 ---> 将所选图像返回到 firstActivity。一切正常
    • 但在此之后,当我点击 firstActivity--> Activity A--> 然后再次返回 firstActivity 时,图像消失了。为什么会这样?
    • 不看Activity A和firstActivity的代码很难判断。你如何存储图像?是否只存在于记忆中?当您返回时,您的活动可能被破坏/重新创建?或者,也许您在从 Activity A 到 firstActivity 的第二次转换期间返回空位图(当您没有通过对话框选择任何内容时)?
    • 我的代码不多。请问我可以把我的项目发到 github 上供你查看吗?
    • 好的,把你项目的链接发给我。
    【解决方案2】:

    您正在调用:activity 引用上的 startActivityForResult,这与您希望调用 onActivityResultCustomDialog 不同。我不记得曾经在不是前台的活动实例上调用startActivityForResult - 我不确定它是否会起作用。建议你把:activity.startActivityForResult改成startActivityForResult

    顺便说一句。在您的onActivityResult 中,您已经调用了两次super.onActivityResult(requestCode, resultCode, data);。这是不正确的。

    【讨论】:

      【解决方案3】:

      onActivityResult() 没有被调用的原因是 onActivityResult() 是在你启动一个结果活动时调用的,即 startActivityForResult(...) 然后当启动的活动返回或完成时 onActivityResult() 被调用

      【讨论】:

      猜你喜欢
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多