13
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() 但它不起作用

而且我不想将图像写入文件。

4

5 回答 5

13

您可以通过在清单文件中设置方向和屏幕大小标志来避免重新创建活动

android:configChanges="keyboard|orientation|screenSize"

如果需要,您可以实现onConfigurationChanged()在方向更改时将调用哪个。更多信息在http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

于 2016-04-02T13:45:36.200 回答
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);
     }
}
于 2013-11-08T11:51:12.230 回答
4

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

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

如果您想保留所选图像,则不应使用实例状态,您可以在此处阅读。

系统使用 onSaveInstanceState() 回调为您保存的捆绑包——它不是为承载大对象(例如位图)而设计的,并且其中的数据必须先序列化然后反序列化,这会消耗大量内存并导致配置更改减缓。在这种情况下,您可以通过在您的活动因配置更改而重新启动时保留一个片段来减轻重新初始化活动的负担。此片段可以包含对您要保留的有状态对象的引用。

我实现了这个解决方案,你可以在我对这个其他问题的回答中找到代码

于 2016-04-02T13:03:45.660 回答
0

而不是返回您甚至没有构建的 DrawingCache(顺便说一句),而是返回位图


执行:

在您的 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;
}
于 2013-11-08T10:25:20.773 回答
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);
}
于 2013-11-08T10:12:21.363 回答