startActivityForResult 使用 ArrayAdapter 将数据传递给 "toActivityResult"

startActivityForResult passing data through to "toActivityResult" using ArrayAdapter

我创建了自定义列表界面。我正在使用数组适配器来管理我的列表视图单元格的按钮点击。我的其中一个按钮会打开一个对话框,显示设备的画廊并允许他们选择图像。

在我的适配器 getView 方法中,我有按钮的点击侦听器。当我选择图像时。我的 Activity 中的 onActivityResult 方法按应有的方式被调用。但是我在阅读 intent.putExtras("id", id) 时遇到了问题,因为它在 Activity 中被读作 null。 这是我在 MainActivityListAdapter:

中调用 startActivityForResult 的方法
public void showExtraPicture(String imgStr, final String qid, String qname) {
    ImageButton gallery = (ImageButton) dialog.findViewById(R.id.gallerybtn);
    gallery.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            System.out.println("BIT: Qid: " + qid);
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            Bundle mBundle = new Bundle();
            mBundle.putSerializable("qid", qid);
            intent.putExtras(mBundle);
            ((Activity) QuestionListAdapter.this.context).startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
            dialog.dismiss();
        } // end method onClick
    }); // end setOnClickListener

}

我尝试过使用 Bundle putSerializable,但这对我不起作用。我猜我的问题与我从 ArrayAdapter 调用数据有关。

这是我的 onActivityResult 在我的 MainActivity:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Bundle mBun = data.getExtras();
    String qid = "";
    if (mBun != null) {
        qid = (String) mBun.getSerializable("qid");
    }
    if (requestCode == 1) {
        if (resultCode == RESULT_OK) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(
                    selectedImage, filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String filePath = cursor.getString(columnIndex);
            cursor.close();


            Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
            try {
                Bitmap image = getBitmapFromUri(selectedImage);
                String stringRepresention = BitMapToString(image);

                //Save string to DB
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

提供给 onActivityResult() 的 Intent 与您用于 startActivityForResult() 的不同;为结果启动的 activity 将使用 setResult(int resultCode, Intent data) 设置提供给 onActivityResult() 函数的 Intent。

因此,您根据最初意图提供的任何额外内容仅在目标 activity(在您的情况下为图像选择器)执行其工作时才有用——您不会在结果中看到这些额外内容(当然,除非目标 activity 特意将它们复制到结果意图中)。

您需要传播什么 qid?您没有包括接收方的用法...所以我假设您需要它以某种方式知道将所选图像放在哪里。

在这种情况下,您应该使用 requestCode 功能。让您的应用程序使用 requestCode->qid 映射来跟踪未决请求。确保为每个 startActivityForResult() 调用使用唯一的 requestCode。您将获得该 requestCode 作为 onActivityResult() 的参数——在您的地图中查找它,您将获得相关的 qid。不要忘记在请求返回时清理您的地图。

可能的警告:您可能需要将映射永久存储在磁盘上,以防您的进程在图像选择器位于顶部时被终止。这种情况可能很少见,但您应该确保对其进行测试并在需要时进行处理。