【问题标题】:Can not pass bitmap between activities in android无法在android中的活动之间传递位图
【发布时间】:2012-07-28 01:36:52
【问题描述】:

我需要通过从其他活动中选择图像来动态更改活动的背景。并将所选图像传递回调用活动,但是当我尝试获取图像时,它为空。 这是我的代码。

  public class SelectGoalBackground extends OrmLiteBaseActivity<DatabaseHelper> {// implements{



GridView gridview ;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.select_goal_background);
   final String from = getIntent().getExtras().getString("from");
    goalsList = new ArrayList<Goal>();

    try {
        goalsList = getTop3Goals();
    } catch (SQLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (java.sql.SQLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }


     gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this));

    gridview.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

           ImageView l = (ImageView)gridview.getChildAt(position);
              Drawable path= l.getDrawable();


            Bitmap bitmap = ((BitmapDrawable)path).getBitmap();

            Intent intent = new Intent(SelectGoalBackground.this, AlarmAppActivity.class);

            intent.putExtra("Bitmap", bitmap);
            startActivity(intent);
            SelectGoalBackground.this.finish();
            return;

    });

}


public class ImageAdapter extends BaseAdapter {
    private Context mContext;

    public ImageAdapter(Context c) {
        mContext = c;
    }

    public int getCount() {
        return mThumbIds.length;
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {  // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }
       Bitmap bm = BitmapFactory.decodeResource(getResources(), mThumbIds[position]);
        imageView.setImageBitmap(bm);
        return imageView;
    }

    // references to our images
    private Integer[] mThumbIds = {
            R.drawable.sample_0, R.drawable.sample_1

    };
}

在调用活动时,我得到这样的位图

    RelativeLayout rel_lay = (RelativeLayout) findViewById(R.id.main_lay);
    Bitmap bitmap = (Bitmap)this.getIntent().getParcelableExtra("Bitmap");


    if (bitmap != null) {

        Log.v("bitmap", "not null");
        Drawable drawable = new BitmapDrawable(getResources(), bitmap);
        rel_lay.setBackgroundDrawable(drawable);
    }

但是这里的位图是空的,它没有设置这个活动的背景。 任何形式的帮助表示赞赏,请帮助

【问题讨论】:

    标签: android bitmap drawable


    【解决方案1】:

    有 3 个解决方案可以解决此问题。

    1) 首先将Image转换为字节数组,然后传入Intent,在下一个活动中从Bundle中获取字节数组并转换为Image(Bitmap)并设置为ImageView。

    将位图转换为字节数组:-

    Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] byteArray = stream.toByteArray();
    

    将字节数组传递给意图:-

    Intent intent = new Intent(this, NextActivity.class);
    intent.putExtra("picture", byteArray);
    startActivity(intent);
    

    从Bundle中获取字节数组并转换为位图图像:-

    Bundle extras = getIntent().getExtras();
    byte[] byteArray = extras.getByteArray("picture");
    
    Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
    ImageView image = (ImageView) findViewById(R.id.imageView1);
    
    image.setImageBitmap(bmp);
    

    2) 首先将图像保存到 SDCard 中,然后在下一个活动中将此图像设置为 ImageView。

    3) 将位图传递到 Intent 并从捆绑包中获取下一个活动中的位图,但问题是如果您的位图/图像大小当时很大,则图像不会在下一个活动中加载。

    【讨论】:

    • Dipak 非常感谢,我知道原因了,我的图像非常大,这就是为什么传递字节数组和位图都不起作用的原因。我认为将图像保存到 sd 卡解决方案会起作用,或者我应该调整图像大小。?有什么建议吗?谢谢
    • @MobileDevFast 是的,您可以使用 bitmap.createscaledbitmap 重新调整图像大小
    • 为什么我在第二个活动中使用 putExtra("picture", byteArray); 得到空数组?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2017-08-05
    • 1970-01-01
    • 2015-04-19
    • 2014-12-08
    相关资源
    最近更新 更多