如何将位图图像从Activity转移到Fragment

时间:2017-02-20 07:38:10

标签: android android-fragments bitmap android-imageview android-image

我的Activity中有一个位图图像,如下所示:

Bitmap image4 = BitmapFactory.decodeResource(getResources(), R.drawable.hello);
        image1.setImageBitmap(image4);

我试图使用此代码在片段中传递此图像:

  FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.addToBackStack(null);
                Secondfrag yourFragment = new Secondfrag();
                Bundle b = new Bundle();
                b.putParcelable("BitmapImage",image4);

                yourFragment.setArguments(b);
                fragmentTransaction.add(R.id.frag, yourFragment, "FRAGMENT");
               fragmentTransaction.commit();

并尝试将此图像放入片段中,如下所示:

Bundle b=this.getArguments();
        String page=b.getString("BitmapImage");

        image2.setImageURI(Uri.parse(page));

但我的片段中没有图像显示。如何解决此问题?

6 个答案:

答案 0 :(得分:2)

将其转换为字节数组

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.context.internal.ManagedSessionContext;

public class TransactionManager {
    public static <T> T doInTransaction(TransactionCallable<T> callable) throws Exception {
        T result = null;
        Session session = null;
        Transaction txn = null;
        SessionFactory sessionFactory = ApplicationContext.get().getSessionFactory();
        try {
            session = sessionFactory.openSession();
            txn = session.beginTransaction();
            ManagedSessionContext.bind(session);
            result = callable.execute();
            txn.commit();
        } catch (RuntimeException e) {
            if (txn != null && txn.isActive())
                txn.rollback();
            throw e;
        } catch (Exception e) {
            if (txn != null && txn.isActive())
                txn.rollback();
            throw new Exception("TransactionManager failure.");
        } finally {
            if (session != null) {
                session.close();
                ManagedSessionContext.unbind(sessionFactory);
            }
        }
        return result;
    }
}

TransactionManager.doInTransaction(new TransactionCallable<Connection>() {
    @Override
    public Connection execute() throws Exception {
        return dao.getById(id);
    }
});

从目标片段获取值

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);

归功于https://stackoverflow.com/a/33797090/4316327

答案 1 :(得分:0)

传递图像参考是一种好方法,而不是传递整个图像数据。

在您的情况下,您可以传递图片Uri

如果您想从内部存储中获取图像,可以通过Uri。但是,如果你只想要一个特定的资源(即drawable),它就可以传递它的名字(String)。

您可以查看此解决方案Passing Uri to an Intent

答案 2 :(得分:0)

您可以在包中传递图像路径/ URI。

在您的情况下,您正在使用资源来制作位图。您可以使用相同的代码来获取片段中的位图。片段中的资源可用作getActivity()。getResources();

Bitmap image4 = BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.hello);
    image1.setImageBitmap(image4);

答案 3 :(得分:0)

请尝试此方法

private void nextpageintent(String photoUri){

Bundle bundle = new Bundle();
bundle.putString("photo", photoUri);
picture picture = new picture();
picture .setArguments(bundle); 
FragmentTransaction transaction = null;
transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.container, picture); 
transaction.addToBackStack(null);
transaction.commit();

}

答案 4 :(得分:0)

在这里,您可以使用Singleton类的getter setter简单地解决这个问题, 首先为你的位图存储制作一个Ben类。

class BitmapStorage {
private static volatile BitmapStorage instance = null;
private Bitmap bitmap = null;
private BitmapStorage () {}

    public static BitmapStorage getInstance() {
        if (instance == null) {
            synchronized(BitmapStorage.class) {
                if (instance == null) {
                    instance = new BitmapStorage();
                }
            }
        }
        return instance;
    }

    public Bitmap getBitmap(){
           return bitmap;
    }

    public void setBitmap(Bitmap bitmap){
           this.bitmap = bitmap;
    }
}

然后在您的活动中将位图设置为您的模型类。像

BitmapStrorage bs = getInstance ();
Bitmap image4 = BitmapFactory.decodeResource(getResources(), R.drawable.hello);
Bs.setBitmap(image4);

每当根据片段生命周期调用片段然后OnCreate方法首先调用,所以在这里我们可以检查位图是否为null并获取位图并使用它。可能不会检查这个解决方案,但我认为这对你有用。

答案 5 :(得分:-1)

投票 Zeerak Hameem 你应该以不同的方式思考