2015-06-11 50 views
1

我已经看到类似的问题,但大多数都显示活动之间传递位图。参考this问题,接受的答案不建议在两个活动之间传递位图时使用包,而是建议使用意向附加组件。但由于我试图在片段之间传递位图,而不是活动,因此我无法使用意图,也不知道除了包之外还有什么其他用途。以下是我在片段之间传递位图的方法:我通过一个接口将位图传递给活动,然后将其传递给该接口内的其他片段。Android通道片段之间的位图

//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(); 
} 

我不知道我是否面临任何问题,如果位图太大等等有没有更好的方法来做到这一点?

谢谢

+3

你为什么不继续承载你片段参考'Activity'位图?然后你就可以为该位图创建一个getter,并将它放在每个附加到该活动的片段中,就像这个'((MyActivity)getActivity())。getBitmap()'。 – rom4ek

+0

@ rom4ek好主意,我现在就试试 – yrazlik

回答

1

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

所以,你可以有

Bitmap mBitmap; 

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

,并调用

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

添加一个位图的变量以及在片段的构造。

+0

如何从静态方法'newInstance()'引用非静态字段'mBitmap'?这根本不起作用。 – fahmy

0

我有很多关于将数据传递给acitvity或fragment的问题。因此,我让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); 
    } 
} 

尝试:d我希望你能帮忙。

0

最后回答。但可以帮助他人。

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

编码位

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

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

然后,您可以将其作为分片newInstance()函数中的捆绑参数传递。

然后你可以再解码字符串得到位图图像

解码图像

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