2015-06-11 47 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);