在学院科技文化节的时候作了一个安卓小应用,实现了:加载图片——人脸分析——添加搞怪表情。
问题:
加载了图片或者添加了表情以后,锁屏,解锁,界面回到了原始状态(图片丢失了)。
缘由:
当解锁的时候,自动调用了一次oncreat,变量们都从新new了一次,因此就回到原始状态了。
解决:
当解锁屏幕的时候,方法调用以下图
咱们须要作的是,重写 onSaveInstanceState 方法。android
To save additional state information for your activity, you must implement onSaveInstanceState() and add key-value pairs to the Bundle object——android 官网segmentfault
代码以下:ide
@Override protected void onSaveInstanceState(Bundle outState) { //保存状态,防止锁屏后图片丢失 // TODO Auto-generated method stub outState.putParcelable("NewBitmap",NewBitmap); outState.putParcelable("img", img); outState.putParcelable("bitmap", bitmap); outState.putInt("ifLoaded", ifLoaded); outState.putFloat("eye_left_x", eye_left_x); outState.putFloat("eye_left_y", eye_left_y); outState.putFloat("eye_right_x", eye_right_x); outState.putFloat("eye_right_y", eye_right_y); outState.putFloat("nose_x", nose_x); outState.putFloat("nose_y", nose_y); outState.putFloat("mouth_x", mouth_x); outState.putFloat("mouth_y", mouth_y); System.out.println("onSaveInstanceState"); super.onSaveInstanceState(outState); }
把须要保存的数据都put进这个Bundle对象。spa
我这里保存的是,bitmap,和一些用来画表情的一些坐标(眼耳口鼻)。code
重写onRestoreInstanceState把刚才保存的值取出来:orm
@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { //恢复状态数据 // TODO Auto-generated method stub ifLoaded=savedInstanceState.getInt("ifLoaded"); NewBitmap=savedInstanceState.getParcelable("NewBitmap"); img=savedInstanceState.getParcelable("img"); bitmap=savedInstanceState.getParcelable("bitmap"); eye_left_x=savedInstanceState.getFloat("eye_left_x"); eye_left_y=savedInstanceState.getFloat("eye_left_y"); eye_right_x=savedInstanceState.getFloat("eye_right_x"); eye_right_y=savedInstanceState.getFloat("eye_right_y"); nose_x=savedInstanceState.getFloat("nose_x"); nose_y=savedInstanceState.getFloat("nose_y"); mouth_x=savedInstanceState.getFloat("mouth_x"); mouth_y=savedInstanceState.getFloat("mouth_y"); if(img!=null){ imageView.setImageBitmap(img); } System.out.println("onRestoreInstanceState"); super.onRestoreInstanceState(savedInstanceState); }
OK,问题解决了。对象
以上是方法一,还有一种方法就是这样的:图片
引用官网的代码,get
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Always call the superclass first // Check whether we're recreating a previously destroyed instance if (savedInstanceState != null) { // Restore value of members from saved state mCurrentScore = savedInstanceState.getInt(STATE_SCORE); mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); } else { // Probably initialize members with default values for a new instance } ... }
换成个人代码的话,我只需变更 if 里面的代码:it
if(savedInstanceState!=null){ ifLoaded=savedInstanceState.getInt("ifLoaded"); NewBitmap=savedInstanceState.getParcelable("NewBitmap"); img=savedInstanceState.getParcelable("img"); bitmap=savedInstanceState.getParcelable("bitmap"); eye_left_x=savedInstanceState.getFloat("eye_left_x"); eye_left_y=savedInstanceState.getFloat("eye_left_y"); eye_right_x=savedInstanceState.getFloat("eye_right_x"); eye_right_y=savedInstanceState.getFloat("eye_right_y"); nose_x=savedInstanceState.getFloat("nose_x"); nose_y=savedInstanceState.getFloat("nose_y"); mouth_x=savedInstanceState.getFloat("mouth_x"); mouth_y=savedInstanceState.getFloat("mouth_y"); if(img!=null){ imageView.setImageBitmap(img); } }
也是这样就能够把保存的数据取出来了。
个人馥这几天不知道怎么了。~又耍脾气不理我了~女人心真难懂~唉。