将ImageView设置为Bitmap并将其发送到下一个Activity

时间:2017-11-09 12:30:59

标签: android

对于Android开发来说相当新。我只是制作一个简单的应用程序,可以检索捕获的图像并将该图像设置为背景。我能够通过使用setBackground(new BitmapDrawble ...)来实现。我的下一个活动是编辑文本视图以及该背景,每当我点击保存按钮时,它将进入下一个可以查看编辑后的文本视图和背景的活动。

我的问题是我能够查看我编辑的文本但无法查看背景。这是我的以下代码。

RetrieveImage.Activity

public static final String EXTRA_MESSAGE = "com.example.hyunsukcirllee.footstep.MESSAGE";
private ImageView mdisplayBackground;
public static final int SEND_MESSAGE = 1;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_retrieve_photo_background);

    //Bundle to get intent
    Bundle extras = getIntent().getExtras();

    //If Bundle is not empty proceed
    if(extras != null){
        //get the imagepass key from the previous activity and set it to bitmap
        Bitmap retrieveImage = (Bitmap) extras.get("imagepass");

        //If the bitmap is not empty
        if(retrieveImage != null){
            //Set it to following imageView
            mdisplayBackground = (ImageView) findViewById(R.id.background_captured);
            mdisplayBackground.setBackground(new BitmapDrawable(getResources(), retrieveImage));
            mdisplayBackground.getBackground().setAlpha(80);

        }
    }
}

//onClick Send button
public void sendMessage(View view){
    //Creating an explicit intent to display the sent message
    Intent footstep_intent = new Intent(this, DisplayMessageActivity.class);

    //EditText Id
    EditText editText = (EditText) findViewById(R.id.editText);

    //User editText
    String message = editText.getText().toString();

    //This part is what I want to implement!!!
    mdisplayBackground = (ImageView) findViewById(R.id.background_captured);
    mdisplayBackground.buildDrawingCache();
    Bitmap image_pass_again = mdisplayBackground.getDrawingCache();

    //Put both Bitmap and String Message to the intent
    footstep_intent.putExtra("Image", image_pass_again);
    footstep_intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(footstep_intent);
}

}

下一个显示图片和文字的活动

private ImageView mdisplayBbackground;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display_message);

    //if the intent has the name image do setbackground
    if(getIntent().hasExtra("Image")) {
        Bundle iimage = getIntent().getExtras();
        Bitmap b = (Bitmap) iimage.get("image");
        mdisplayBbackground = (ImageView) findViewById(R.id.background_capturedd);
        mdisplayBbackground.setBackground(new BitmapDrawable(getResources(), b));

    }

    //if the intent contains the message-> view
    if (getIntent().hasExtra(RetrievePhotoBackgroundActivity.EXTRA_MESSAGE)){
        Intent footstep_intent = getIntent();
        String message = footstep_intent.getStringExtra(RetrievePhotoBackgroundActivity.EXTRA_MESSAGE);
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(message);
    }
}

}

以下代码单击“发送”按钮后,当前不起作用。我已经搜索过使用上面的代码传递位图并将其设置为内容URI,但我猜不太清楚这个概念。 所以问题是“有没有办法绕过使用外部存储来调用图像文件的直接路径来为下一个Activity设置imageView?” 另一个问题是“我还在这个区域练习,所以如果在编码方面有更好的格式,我想得到一些反馈” 谢谢!

2 个答案:

答案 0 :(得分:1)

您不应该在不同的屏幕之间发送位图,它会在一个点上导致内存泄漏,因为每个位图都应该在工作完成后回收。
此外,您不应该自己处理图像加载/处置/缓存/等 - 考虑使用像Glide或Picasso这样的库,第一个是Google推荐的。

以下是从文件系统加载图片的示例,profileAvatar是一个ImageView:

Glide.with(mContext)
    .load(new File(filePath))
    .into(profileAvatar);

非常容易使用;)默认情况下,Glide会将图像缓存在内存中。

答案 1 :(得分:0)

强烈推荐一种不同的方法。

如果你有一个较旧的手机和一个大的位图,它可能无法工作。如果你真的想要这样做,它可能会有用,但它会花费大量内存而且速度也很慢。相反,如果你真的想做,那么传递位图如下

发送位图

try {
    //Write file
    String filename = "abc.png";
    FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE);
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);

    //Cleanup
    stream.close();
    bmp.recycle();

    //Pop intent
    Intent in1 = new Intent(this, Activity2.class);
    in1.putExtra("image", filename);
    startActivity(in1);
} catch (Exception e) {
    e.printStackTrace();
}

接收方

Bitmap bmp = null;
String filename = getIntent().getStringExtra("image");
try {
    FileInputStream is = this.openFileInput(filename);
    bmp = BitmapFactory.decodeStream(is);
    is.close();
} catch (Exception e) {
    e.printStackTrace();
}