繁体   English   中英

Android 在片段之间传递 Bitmap

[英]Android pass Bitmap between fragments

我见过类似的问题,但其中大多数都显示了在活动之间传递位图。 参考问题,已接受的答案不建议在两个活动之间传递位图时使用 bundle,而是建议使用 Intent Extras。 但是因为我试图在片段之间传递位图,而不是活动,所以我不能使用意图并且不知道除了包之外还有什么可以使用。 这是我在片段之间传递位图的操作:我通过一个接口将位图传递给活动,然后将它传递给该接口内的其他片段。

//MyActivity.java

@Override
public void onMyFragmentFired(Bitmap bitmap) {
    FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
    args=new Bundle();
    fragment = MyFragment.newInstance();

    if(bitmap != null){
        args.putParcelable("EXTRA_BITMAP", bitmap);
    }

    fragment.setArguments(args);

    ft.add(fragment, "com.example.myfragment");
    ft.commit();
}

我想知道如果位图太大等我是否会遇到任何问题。有没有更好的方法来做到这一点?

谢谢

您可以将位图添加到 newInstance 函数中。

所以你可以有

Bitmap mBitmap;

public static newInstance(Bitmap b)
{
     mBitmap = b;
}

并调用

if(bitmap!=null)
{
     fragment = MyFragment.newInstance(bitmap);
}

在片段的构造函数中也添加一个位图变量。

迟到的答复。 但可以帮助别人。

另一种可以测试的方法是将您的位图转换为 Base64 字符串。 然后在创建片段时将其发送到片段。

编码位图

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream .toByteArray();
    String encodedBitmap = Base64.encodeToString(byteArray, Base64.DEFAULT);

上面的代码将创建一个你可以使用的长字符串。

然后你可以将它作为一个 bundle 参数在片段newInstance()函数中传递。

然后你可以再次解码字符串以获取位图图像

解码图像

byte[] decodedString = Base64.decode(encodedBitmap, Base64.DEFAULT);
Bitmap decodedBitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);

我设法使用Android 架构组件传递位图,并在片段之间共享ViewModel ,如有关在片段之间共享数据的官方文档中所述。 我不知道这是否是最佳实践,但对于我的用例来说它有效。

我有很多关于将数据传递给活动或片段的问题。 结果,我让 DataCache 在任何地方传递任何对象。

但我从未尝试过在片段之间传递位图。 我认为这对你有用。 这是一个超级简单的例子。 Gihub: https : //github.com/kimkevin/cachepot

发件人的片段

public class FragmentA {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DataCache.getInstance().push(yourBitmap);
    }
}

接收器的片段

public class FragmentB {
    @Override
    public void onCreate(Bundle savedInstanceState) {           
        super.onCreate(savedInstanceState);
        Bitmap yourBitmap = DataCache.getInstance().pop(Bitmap.class);
    }
}

试试吧:我希望你能帮上忙。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM