【问题标题】:How to send the bitmap into bundle如何将位图发送到包中
【发布时间】:2016-02-21 04:34:51
【问题描述】:

我是安卓新手。我想将位图传递给 Bundle。但我找不到任何解决方案。其实,我很困惑。我想在对话框片段中显示图像。但我不知道如何放入Bundle。我应该发送PutByteArray() 吗?但是,如果我将位图作为参数传递,则说明它是一个错误的参数。

这是我的代码:

public class MyAlert extends DialogFragment {
  Bitmap b;
  public MyAlert newInstance(Bitmap b) {
    this.b=b;
    MyAlert frag=new MyAlert();
    Bundle args=new Bundle();
    args.put("bitByte",b);
    frag.setArguments(args);
    return frag;
  }

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    Bitmap bitmap=getArguments().getByteArray("bitByte");
    return new AlertDialog().Builder(getActivity());

    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()).setView(R.id.fragid).create();

【问题讨论】:

标签: android bitmap


【解决方案1】:

如果你使用NavigationComponent,你应该使用safeArgs

您可以像这样在nav_graph 中输入参数:

<argument
        android:name="profileImage"
        app:nullable="true"
        app:argType="android.graphics.Bitmap" />

并像这样发送:(第一个片段)

findNavController().navigate(SettingFragmentDirections.actionSettingFragmentToHomeFragment(bitmap))

并像这样给它:(第二个片段)

 val bitmapimage =
            arguments?.getParcelable<Bitmap>("profileImage")


        user_profile_img.setImageBitmap(bitmapimage)

阅读更多:https://developer.android.com/guide/navigation/navigation-pass-data

【讨论】:

    【解决方案2】:

    如果您想使用 bundle 传递图像,那么我相信它会对您有所帮助。

    Bundle bundle = new Bundle();
    bundle.putParcelable("bitmap", bitmap);
    fragment.setArguments(bundle);
    

    【讨论】:

      【解决方案3】:

      无需将位图转换为字节数组。您可以直接将位图放入捆绑包中。请参考以下代码将位图放入包中。

      bundle.putParcelable("BitmapImage",bitmapname);
      

      通过以下代码从 Bundle 中获取位图

      Bitmap bitmapimage = getIntent().getExtras().getParcelable("BitmapImage");
      

      【讨论】:

      • 如果您的捆绑包用于 IPC,这可能是要走的路。如果您尝试存储它,您可能会收到以下错误:“尝试编组包含 Binder 对象的包裹”。在这种情况下,只需使用上述字节数组解决方案stackoverflow.com/a/33797090/3969362
      【解决方案4】:

      我认为将图像的路径或地址作为字符串发送并加载到另一端会更容易。

      如果图片是网址,你可以使用 Glide 或 Picasso 库并缓存它们,这样其他的活动或片段就不会加载两次。

      【讨论】:

      • 但是我不允许使用第三方库。并将图像的示例代码作为字符串发送。实际上我已经使用了 uri 并在活动中显示了图像。当我单击该图像时,该图像应出现在对话框片段中。
      • 我没有说图片是字符串,我指的是路径,如果你展示了图片,我想你已经完成了,但如果你愿意,我可以更新答案。
      • 我现在面临的问题是如何使用该位图并将其发送到对话框片段并在其上显示。我无法理解 Andriod Developers 网站上的代码。如果可以提供帮助,不胜感激。
      • 从现在开始,请发布您的问题并提供更多详细信息。例如,您应该说过如何在对话框中显示图像。
      • 不用道歉,你的大部分问题(考虑到你是android新手)已经在这个网站上回答了,所以你可以在发布新问题之前寻找它们,它会节省你有时间。
      【解决方案5】:

      首先将其转换为Byte array,然后将其添加到意图、发送出去并解码。

      //转换为字节数组

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
        byte[] byteArray = stream.toByteArray();
      
      Bundle b = new Bundle();
      b.putByteArray("image",byteArray);
      
      
        // your fragment code 
      fragment.setArguments(b);
      

      通过意图获取价值

      byte[] byteArray = getArgument().getByteArrayExtra("image");
      Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
      

      【讨论】:

      • 我猜 Intent 在 Fragments 中是不可能的,对吧?这就是我们使用 bundle 的原因?
      • 为什么,如果您可以简单地致电:b.putParcelable("image", bmp)?
      • 在对话框片段中我应该在consrtuctor还是onCreateDialog中获取位图数组?
      • @Sayyaf 你 DON'T 需要任何数组:BitmapParcelable 所以你可以直接传递它,请参阅我对你原来问题的评论
      猜你喜欢
      • 2011-04-09
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 2013-08-04
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多