[英]Back to previous activity in android
我有活动A,B和C。 在活动C中,它具有图像和标题。 单击ok
button
时,图像和标题将返回B。 在活动b中,它将同时返回活动A。
活动C
ok.setOnClickListener(new View.OnClickListener() // ok button to return image and caption to B
{
public void onClick(View arg0)
{
Intent returnIntent=new Intent();
text=t.getText().toString();
b.setDrawingCacheEnabled(true);
b.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
b.layout(0, 0, b.getMeasuredWidth(), b.getMeasuredHeight());
b.buildDrawingCache(true);
returnIntent.putExtra("text", text);
if (b.getDrawingCache() != null) {
Bitmap bitmap = Bitmap.createBitmap(b.getDrawingCache());
if (bitmap == null) {
Log.e("TAG", "getDrawingCache() == null");
}
Global.img = bitmap;
}
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
});
活动B
public void onActivityResult(int requestCode,int resultCode, Intent data)
{
if(requestCode==PROJECT_REQUEST_CODE) {
if(data!=null&&data.hasExtra("text")) {
c = data.getStringExtra("text");
txt1.setText(c); // caption can show in txt1
viewImage.setImageBitmap(Global.img); // image from C can show in viewImage
}
}
else if (requestCode==CAMERA_REQUEST_CODE)
{
}
}
b.setOnClickListener(new View.OnClickListener() { // button to return image and caption to A
public void onClick(View arg0) {
Intent returnIntent = new Intent();
returnIntent.putExtra("c",c); // return caption
returnIntent.putExtra("globalImg",Global.img);
setResult(Activity.RESULT_OK, returnIntent);
finish();
}
});
活动A
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Bitmap b = Global.img
if (requestCode==1) {
caption = data.getStringExtra("c"); // caption from A
v.setImageBitmap(Global.img) // image from C
}else if {.....}
}
Global.java
public class Global {
static Bitmap img;
}
当我在活动B中单击button
b时,我得到了
11-05 17:26:47.114 6031-6031 / com.example.project.project E / JavaBinder:!!! 绑定交易失败!!!
如果您只是想将C-> B返回的数据传递给A,那么为什么不将字符串再次放入onClick中并放入您的意图中呢? 您可以将文本存储在String成员中,或者按照代码现在的样子,甚至可以从TextView中获取它:
Intent returnIntent = new Intent();
returnIntent.putExtra("text", txt1.getText().toString);
setResult(Activity.RESULT_OK, returnIntent);
图像是作为静态对象存储在全局对象中的,老实说这很可怕,但是您当然也可以从onClickListener访问它。 但是,您应该认真考虑以其他方式返回位图数据,最直接的可能就是利用位图实现Parcelable接口,并且Intent可以将putExtra("img", bitmap)
保留为额外内容,因此从理论上讲,您可以只做putExtra("img", bitmap)
在接收端执行intent.getParcelableExtra("img")
。
但是,如果位图很大,则可能会失败,因此最好将位图存储到资源(例如文件)中,然后传递文件的位置。 您也可能会获得与Global类中的静态成员相同的方式,但是1)您必须小心地将对象传回之后删除该对象,否则静态引用将浪费内存; 2)确保您不不要错误地使用此引用,例如模拟地从多个地方使用。 一个更可靠的解决方案是确保为每个位图创建一个唯一的ID,并将其存储在缓存中(例如,以Bitmaps hashCode()为键的HashMap)并通过ID进行标识。
public class BitmapStore {
private static final HashMap<Integer, Bitmap> BITMAPS= new HashMap<>();
public static Bitmap getBitmap(int id) {
return BITMAPS.remove(id);
}
public static int putBitmap(Bitmap b) {
int id = b.hashCode();
BITMAPS.put(id, b);
return id;
}
}
使用此方法,可以将位图的ID放入意图中:
intent.putExtra("imageId", BitmapStore.putBitmap(bitmap));
setResult(RESULT_OK, intent);
并在onActivityResult
:
Bitmap b = BitmapStore.getBitmap(intent.getIntExtra("imageId", 0));
该位图存储不是持久性的,但在两个活动之间的过渡中用作中间存储应该是相当安全的。 也有可能推广到任何实现有效hashCode / equals合同的对象。
尝试对此行发表评论:
//returnIntent.putExtra("globalImg",Global.img);
在您的活动B中
您可以对所有活动使用Global.img,而不能使用意图
添加:
v.setImageBitmap(Global.img);
-> nullPointerExeption因为v
没有初始化
添加:
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inJustDecodeBounds = false;
bitmapOptions.inPreferredConfig = Config.RGB_565;
bitmapOptions.inDither = true;
对于“内存不足”错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.