【问题标题】:startActivityForResult passing data through to "toActivityResult" using ArrayAdapterstartActivityForResult 使用 ArrayAdapter 将数据传递到“toActivityResult”
【发布时间】:2015-08-24 13:43:07
【问题描述】:

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

在我的适配器getView 方法中,我有按钮的点击监听器。当我选择图像时。我的 Activity 中的 onActivityResult 方法被调用了。但是我在阅读intent.putExtras("id", id) 时遇到了麻烦,因为它在活动中被读取为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();
            }

        }
    }
}

【问题讨论】:

  • 为什么不使用 putString 和 getString 而不是 putserializable ?
  • 我都试过了,我只是在创建这个问题之前最后一次尝试了putSerializable。两者都不起作用。有什么想法吗?
  • 嗨,拉米,那也没用。

标签: android android-intent android-arrayadapter android-gallery


【解决方案1】:

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

因此,您在原始意图上提供的任何额外内容仅在目标活动(在您的情况下为图像选择器)正在完成其工作时才有用 - 您不会在结果中看到这些额外内容(除非目标活动当然,不会将它们复制到结果意图中)。

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

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

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

【讨论】:

  • 您是否有任何示例代码说明如何进行 requestCode->qid 映射?
  • 不,但这不应该那么难。我会使用SparseArray。只需将一个 int 用作索引(其中 已经在其中 - 小心比赛!)并将您的 qid 放在那个位置。然后在你的 onActivityResult() 代码中获取它。
  • 酷,我明白了。谢谢
  • 祝你好运,玩得开心! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2012-07-20
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多