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()但它无法正常工作
我不想把图像写成文件。
答案 0 :(得分:8)
您可以通过在清单文件中设置orientation和screenize标志来避免重新创建活动
android:configChanges="keyboard|orientation|screenSize"
如果需要,您可以实施onConfigurationChanged()
,当方向发生变化时,将调用irc.addListener('kick', function (channel, who, by, reason) {
console.log('%s was kicked from %s by %s: %s', who, channel, by, reason);
});
。更多信息请参见http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
答案 1 :(得分:6)
这可能对你有帮助......
@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);
}
}
答案 2 :(得分:4)
屏幕旋转时图像消失的原因是活动被破坏并重新创建。 在此过程中,您不会保留所选图像,因为您可以阅读here
警告:每次用户旋转屏幕时,您的活动都将被销毁并重新创建。当屏幕更改方向时,系统会破坏并重新创建前台活动,因为屏幕配置已更改,您的活动可能需要加载其他资源(例如布局)。
如果您想保留所选图像,则不应使用实例状态,因为您可以阅读here。
系统使用onSaveInstanceState()回调为您保存的捆绑包 - 它不是为承载大型对象(如位图)而设计的,并且其中的数据必须序列化然后反序列化,这会消耗大量内存并使配置变化缓慢。在这种情况下,您可以通过在配置更改时重新启动活动时保留Fragment来减轻重新初始化活动的负担。此片段可以包含对要保留的有状态对象的引用。
我实施了此解决方案,您可以在我对其他question
的回答中找到代码答案 3 :(得分:0)
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);
}
答案 4 :(得分:0)
不返回你甚至没有构建的DrawingCache(顺便说一句),而是返回Bitmap
<强>实施强>
在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);
}
在配置保存中,保存此位图:
@Override
@Deprecated
public Object onRetainNonConfigurationInstance() {
return bTemp;
}