回到以前的android活动

时间:2015-11-04 07:51:47

标签: java android android-intent android-activity android-camera

我有活动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:!!!失败的粘合剂交易!!!

2 个答案:

答案 0 :(得分:2)

如果您要做的只是将从C-> B返回的数据传递给A,为什么不在您的onClick中再次获取该字符串并将其置于您的意图中? 您可以将文本存储在String成员中,或者,正如代码现在看到的那样,甚至可以从TextView中取回它:

Intent returnIntent = new Intent();
returnIntent.putExtra("text", txt1.getText().toString);

setResult(Activity.RESULT_OK, returnIntent);

图像作为静态存储在全局对象中,这实际上很可怕,但您当然可以从onClickListener访问它。但是你应该认真考虑以其他方式返回位图数据,最简单的可能就是利用Bitmaps实现Parcelable接口,Intents可以将Parcelables作为附加内容,所以理论上你可以只做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契约的任何类型的对象。

答案 1 :(得分:0)

尝试评论此行:

//returnIntent.putExtra("globalImg",Global.img);
你的活动B中的

您可以将Global.img用于所有活动而不使用意图

<强>加了:

v.setImageBitmap(Global.img); - &gt; nullPointerExeption因为v未初始化

<强>加了:

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 
bitmapOptions.inJustDecodeBounds = false; 
bitmapOptions.inPreferredConfig = Config.RGB_565; 
bitmapOptions.inDither = true; 

“内存不足”错误。