簡體   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