屏幕旋转发生时,ImageView不保留图像

import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Parcelable; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends Activity { ImageView iv; Bitmap bTemp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button cameraClick = (Button) findViewById(R.id.click); iv = (ImageView) findViewById(R.id.imageView1); final Bitmap data = (Bitmap) getLastNonConfigurationInstance(); if (data == null) { iv.setImageBitmap(bTemp); } cameraClick.setOnClickListener(myhandler); } OnClickListener myhandler = new OnClickListener() { public void onClick(View v) { Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 0); } }; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Bitmap bm = (Bitmap) data.getExtras().get("data"); iv.setImageBitmap(bm); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override @Deprecated public Object onRetainNonConfigurationInstance() { bTemp = iv.getDrawingCache(); return bTemp; } } 

我正在使用ImageView来存储使用Camera Intent捕捉的图像,但是当屏幕旋转时,图像会丢失。 我尝试使用onRetainNonConfigurationInstance(),但它不工作

而且我不想把这个图像写成文件。

Solutions Collecting From Web of "屏幕旋转发生时,ImageView不保留图像"

这可能会帮助你…

 @Override protected void onSaveInstanceState(Bundle outState) { BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable(); Bitmap bitmap = drawable.getBitmap(); outState.putParcelable("image", bitmap); super.onSaveInstanceState(outState); } protected void onCreate(Bundle savedInstanceState) { if(savedInstanceState != null) { Bitmap bitmap = savedInstanceState.getParcelable("image"); imageView.setImageBitmap(bitmap); } } 

您可以通过在Manifest文件中设置方向和屏幕标志来避免重新创build活动

 android:configChanges="orientation|screenSize" 

如果需要的话,你可以实现onConfigurationChanged()改变时调用。 更多信息请见http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

屏幕旋转时图像消失的原因是该活动被破坏并重新创build。 在此过程中,所选图像不会保留,因为您可以在这里阅读

注意:每次用户旋转屏幕时,您的活动将被破坏并重新创build。 当屏幕改变方向时,系统会破坏并重新创build前台活动,因为屏幕configuration已更改,您的活动可能需要加载替代资源(例如布局)。

如果你想保留选定的图像,你不应该使用实例状态,你可以在这里阅读。

使用onSaveInstanceState()callback函数为您保存的捆绑包 – 它不是用于传输大对象(比如位图),而且其中的数据必须被序列化然后反序列化,这会消耗大量内存并使configuration更改慢。 在这种情况下,当您的活动由于configuration更改而重新启动时,您可以通过保留一个片段来减轻重新初始化活动的负担。 该片段可以包含对要保留的有状态对象的引用。

我实现了这个解决scheme,你可以在我的答案中find这个问题的代码

而不是返回你甚至没有build立的DrawingCache(btw),返回位图


执行:

在你的onActivityResult中,保持bTemp中的位图:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); bTemp = (Bitmap) data.getExtras().get("data"); iv.setImageBitmap(bTemp); } 

在你的configuration保存中,保存这个位图:

 @Override @Deprecated public Object onRetainNonConfigurationInstance() { return bTemp; } 

getLastNonConfigurationInstance()返回一个活动实例。 您可以从该实例获取以前的值:

在你的onCreate()

 YourActivity prevActivity = (YourActivity) getLastNonConfigurationInstance(); if(prevActivity!= null) { this.bTemp = prevActivity.bTemp; } 

和你的onRetainNonConfigurationInstance()方法应该是:

 @Override @Deprecated public Object onRetainNonConfigurationInstance() { return bTemp; } 

和你的'onActivityResult()`方法应该是:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); bTemp = (Bitmap) data.getExtras().get("data"); iv.setImageBitmap(bTemp); }